Задать вопрос
@scanmor

Как объект, состоящий из массивов значений свойств, преобразовать в массив объектов?

Есть объект:

{
  TX1: [   1  ,  2  ,  3   ],
  TX2: ["one", "two", "three" ],
  TX3: ["blue", "red", "green"]
}

Надо сделать массив:

[
 { 
   TX1: 1,
   TX2: "one",
   TX3: "blue"
 },
 { 
   TX1: 2,
   TX2: "two",
   TX3: "red"
 },
 { 
   TX1: 3,
   TX2: "three",
   TX3: "green"
 },
]

Проблема в том, что ключей может быть сколько угодно. И они могут иметь любые имена. Не получится обращаться к TX1, TX2, TX3. А если проходить циклом по ним, то как вообще обращаться ко всем остальным и их массивам?
  • Вопрос задан
  • 141 просмотр
Подписаться 1 Средний Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const arr = Object
  .entries(obj)
  .reduce((acc, [ k, values ]) => (
    values.forEach((v, i) => (acc[i] ??= {})[k] = v),
    acc
  ), []);

или

const keys = Object.keys(obj);
const arr = obj[keys[0]]?.map((_, i) => {
  return Object.fromEntries(keys.map(k => [ k, obj[k][i] ]));
}) ?? [];

или

const zip = (arrs, defaultValue = null) =>
  Array.from(
    { length: Math.max(...arrs.map(n => n.length)) },
    (_, i) => arrs.map(n => i < n.length ? n[i] : defaultValue)
  );

const combine = (keys, values, defaultValue = null) =>
  keys.reduce((acc, n, i) => (
    acc[n] = i < values.length ? values[i] : defaultValue,
    acc
  ), {});

const arr = Array.from(
  zip(Object.values(obj)),
  combine.bind(null, Object.keys(obj))
);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы