Как из 2 массивов сделать один по один ключу id

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

arr1 = [
    {
        id: "1",
        value: 2,
    },
    ...
]

arr2 = [
    {
        id: "1",
        name: 2,
        el: 3,
        cons: 000
    },
    ...
]

Нужно собрать из него один по id:

arNew = [
    {
        id: "1",
        value: 2,
        name: 2,
        el: 3,
        cons: 000
    },
    ...
]

Ответы (1 шт):

Автор решения: vsemozhebuty

Один из вариантов.

Соединяем массивы, проходимся по результату при помощи .reduce() с начальным аккумулятором в виде пустого объекта. На каждой итерации проверяем, нет ли в нашем аккумуляторе ключа, равного id. Если нет, создаём ключ с начальным значением пустого объекта. Проверку и создание можно сократить до одного шага при помощи ??=. Теперь мы можем сливать все подходящие объекты при помощи Object.assign() (можно даже выражение с ??= подать первым аргументом в Object.assign()). В конце нам останется только превратить аккумулятор в массив объединённых объектов при помощи Object.values().

const arr1 = [{
  id:"1",
  value:2,
}];

const arr2 = [{
  id:"1",
  name:2,
  el:3,
  cons: 0
}];

const arr3 = Object.values(arr1.concat(arr2).reduce(
  (acc, obj) => {
    Object.assign(acc[obj.id] ??= {}, obj);
    return acc;
  },
  {},
));

console.log(arr3);

Вариант немного пространнее, алгоритм почти тот же (также этот вариант может быть чуть быстрее и экономнее, так как не создаётся вначале единый массив из двух):

const arr1 = [{
  id:"1",
  value:2,
}];

const arr2 = [{
  id:"1",
  name:2,
  el:3,
  cons: 0
}];

const acc = {};

for (const obj of arr1) {
  if (!acc[obj.id]) acc[obj.id] = {};
  Object.assign(acc[obj.id], obj)
}

for (const obj of arr2) {
  if (!acc[obj.id]) acc[obj.id] = {};
  Object.assign(acc[obj.id], obj)
}

const arr3 = Object.values(acc);

console.log(arr3);

→ Ссылка