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

Как создать массив объектов на основе двух массивов?

Есть два массива:

const idArray = [3, 5, 6];
const nameArray = ['Dima', 'Oleg', 'Vova', 'Kate' ];

Нужно на выходе получить такой массив:

const newArray = [
  {name: 'Dima', id: 3},
  {name: 'Oleg', id: 5},
  {name: 'Vova', id: 6},
  {name: 'Kate'},
  {name: 'Vita'}
]

То есть, если id нету, то будет элемент с одним свойством name.
  • Вопрос задан
  • 159 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 3
@StockholmSyndrome
const newArray = nameArray.map((name, i) => idArray[i] ? {name, id: idArray[i]} : {name});
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
Не будем ограничиваться двумя массивами. Соответственно, и ключи хардкодить тоже не будем. Пусть функция принимает массив ключей и массив массивов значений:

function combine(keys, values) {
  const length = Math.max(0, ...values.map(n => n.length));
  const arr = Array.from({ length }, () => ({}));
  values.forEach((n, i) => n.forEach((v, j) => arr[j][keys[i]] = v));
  return arr;
}

// или

const combine = (keys, values) =>
  Array.from(
    { length: values.reduce((max, { length: n }) => max > n ? max : n, 0) },
    (_, j) => keys.reduce((acc, k, i) => (
      j < values[i].length && (acc[k] = values[i][j]),
      acc
    ), {})
  );

// или

const combine = (keys, values) =>
  keys.reduce((acc, k, i) => (
    values[i].forEach((v, j) => (acc[j] = acc[j] || {})[k] = v),
    acc
  ), []);

Пользоваться всем этим, понятное дело, так:

const newArray = combine([ 'name', 'id' ], [ nameArray, idArray ]);
Ответ написан
Комментировать
@afanasiyz
Javascript-разработчик
Самый простой и очевидный вариант.

nameArray.map((elem, index) => {
  if (idArray[index]) {
    return {
      name: elem,
      id: idArray[index],
    };
  }
  return {
    name: elem,
  };
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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