Как из 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 шт):
Один из вариантов.
Соединяем массивы, проходимся по результату при помощи .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);