Как правильно сравнивать/собирать два массива, чтобы получить третий? / JavaScript
Например у меня есть 2 массива объектов:
let arr1 = [{num:'24', id:'123'},{num:'2', id:'123'},{num:'22',id:'123'},...]
let arr1 = [{num:'42', stat: 2}},{num:'2', stat: 2}},{num:'21',stat: 2}},...]
Цель, например, если num в обоих массивах одинаковый, то либо в arr1 добавить параметр stat или собрать arr3
let arr3 = [{num:'24', id:'123'},{num:'2', id:'123', stat: 2}},{num:'22',id:'123'},...]
Делал через map, т.е.:
arr1.map(iArr1 => {
arr2.map(iArr2 => {
if(iArr1.num === iArr2.num){
//И создаю/добавляю или что-то еще делаю, чтобы вышло, как нужно
}
})
})
Но этот вариант мне не нравится, кажется каким-то "кривым". И так же иногда в объектах есть еще массивы, которые так же нужно разложить => 50 map-ов выглядят мягко говоря странновато. Может быть кто-нибудь подскажет способы получше работать в таких ситуациях с массивами?
Ответы (1 шт):
Обычно в таких случаях оптимальнее всего использовать временную промежуточную структуру, где ключами будут ключевые для объединения поля, — так не придётся по много раз перебирать элементы исходных массивов в поисках объектов с общими ключами. Памяти будет затрачено больше, но времени, скорее всего, меньше. Потом эту структуру можно преобразовать в нужный формат.
Пример объединения объектов по ключу в третьем массиве (задан только ключ объединения, все остальные свойства копируются универсально):
const arr1 = [{ num: '24', id: '123' }, { num: '2', id: '123' }, { num: '22', id: '123' }];
const arr2 = [{ num: '42', stat: 2 }, { num: '2', stat: 2 }, { num: '21', stat: 2 }];
const temp = {};
for (const object1 of arr1) {
temp[object1.num] = { ...object1 };
}
for (const object2 of arr2) {
temp[object2.num] = { ...temp[object2.num], ...object2 };
}
const arr3 = Object.values(temp);
console.log(arr3);