Перенос объектов одного массива в свойства объекта из другого массива по ID
подскажите пожалуйста как из
const arr1 = [
{name: 'aaaaa', id: 1 },
{name: 'bbbbbb', id: 2 },
{name: 'ccccc', id: 3 },
{name: 'aaaasds', id: 4 },
{name: 'asdsada', id: 5 },
{name: 'asdsadasd', id: 6 },
]
const arr2 = [
{name: 'adsaszzc123213', ids: 1 },
{name: 'bbbbbb', ids: 1 },
{name: 'ccccc', ids: 6 },
{name: 'asdas dxc zz ', ids: 2 },
{name: 'zxc zx czx c', ids: 2 },
{name: 'zxc zx czx cz', ids: 6 },
{name: 'adsaszzc123213', ids: 1 },
{name: '111', ids: 1 },
{name: 'ccccc', ids: 3 },
{name: 'zxc dxc zz ', ids: 3 },
{name: 'zxc zx 111111111czx c', ids: 5 },
{name: 'zxc zx czx cz', ids: 4 },
]
сделать
const arr1 = [
{name: 'aaaaa', id: 1,
childs: [
{name: 'adsaszzc123213', ids: 1 },
{name: 'bbbbbb', ids: 1 },
{name: 'adsaszzc123213', ids: 1 },
{name: '111', ids: 1 }
]
},
{name: 'bbbbbb', id: 2,
childs: [
{name: 'asdas dxc zz ', ids: 2 },
{name: 'zxc zx czx c', ids: 2 }
]
},
{name: 'ccccc', id: 3,
child: [
{name: 'ccccc', ids: 3 },
{name: 'zxc dxc zz ', ids: 3 }
]
},
{name: 'aaaasds', id: 4, childs: [{name: 'zxc zx czx cz', ids: 4 }]},
{name: 'asdsada', id: 5, childs: [{name: 'zxc zx 111111111czx c', ids: 5 }]},
{name: 'asdsadasd', id: 6,
child: [
{name: 'ccccc', ids: 6 },
{name: 'zxc zx czx cz', ids: 6 }
]
},
]
Ответы (2 шт):
Используя метод .forEach() перебираем каждый элемент массива arr1, получая его как item. Затем этому item определяем новое свойство childs в которое из массива arr2 с помощью метода filter помещаем новый массив элементов, в которых ids совпадает с item.id.
const arr1 = [
{name: 'aaaaa', id: 1 },
{name: 'bbbbbb', id: 2 },
{name: 'ccccc', id: 3 },
{name: 'aaaasds', id: 4 },
{name: 'asdsada', id: 5 },
{name: 'asdsadasd', id: 6 },
]
const arr2 = [
{name: 'adsaszzc123213', ids: 1 },
{name: 'bbbbbb', ids: 1 },
{name: 'ccccc', ids: 6 },
{name: 'asdas dxc zz ', ids: 2 },
{name: 'zxc zx czx c', ids: 2 },
{name: 'zxc zx czx cz', ids: 6 },
{name: 'adsaszzc123213', ids: 1 },
{name: '111', ids: 1 },
{name: 'ccccc', ids: 3 },
{name: 'zxc dxc zz ', ids: 3 },
{name: 'zxc zx 111111111czx c', ids: 5 },
{name: 'zxc zx czx cz', ids: 4 },
]
arr1.forEach(item => {item.childs = arr2.filter(i => i.ids === item.id);});
console.log(arr1);
Решение без лишних вложенных циклов, в 2 прохода (по одному на каждый массив):
const arr1 = [
{ name: 'aaaaa', id: 1 },
{ name: 'bbbbbb', id: 2 },
{ name: 'ccccc', id: 3 },
{ name: 'aaaasds', id: 4 },
{ name: 'asdsada', id: 5 },
{ name: 'asdsadasd', id: 6 },
];
const arr2 = [
{ name: 'adsaszzc123213', ids: 1 },
{ name: 'bbbbbb', ids: 1 },
{ name: 'ccccc', ids: 6 },
{ name: 'asdas dxc zz ', ids: 2 },
{ name: 'zxc zx czx c', ids: 2 },
{ name: 'zxc zx czx cz', ids: 6 },
{ name: 'adsaszzc123213', ids: 1 },
{ name: '111', ids: 1 },
{ name: 'ccccc', ids: 3 },
{ name: 'zxc dxc zz ', ids: 3 },
{ name: 'zxc zx 111111111czx c', ids: 5 },
{ name: 'zxc zx czx cz', ids: 4 },
];
const map = arr1.reduce(
(m, item1) => m.set(item1.id, Object.assign(item1, { childs: [] }))
, new Map());
for (const item2 of arr2)
map.get(item2.ids).childs.push(item2);
console.log(arr1);
Именно в данном случае, сокращение числа проходов может дать улучшение в скорости только если избавиться от "паразитных" вызовов и создания временного объекта (да и то не гарантированно) - но это детали, которые не должны отвлекать от главной мысли: задачи подобные этой, возможно решить в два прохода, если использовать хэштаблицу для индексации элементов по полю группировки значений.