Как добавить новые значения из одного массива в другой
Есть массивы A и B.
В них обоих содержатся объекты.
У каждого объекта есть A[i].Key и B[i].Key;
Собственно вопрос:
Как из массива A добавить те элементы в массив B, значения Key которых не содержатся в B.
Ответы (3 шт):
Автор решения: Darth
→ Ссылка
const A = [{key: 1}, {key: 2}, {key: 3}];
const B = [{key: 3}, {key: 4}, {key: 5}];
B.push(...A.filter(el => !B.find(({key}) => el.key === key)));
console.log(B);
UP (дубли + древний JS):
const A = [{key: 1}, {key: 2}, {key: 3}, {key: 1}, {key: 2}, {key: 3}];
const B = [{key: 3}, {key: 4}, {key: 5}];
A.forEach(function(elA){
!B.filter(function(elB){
return elA.key === elB.key
}).length && B.push(elA);
})
console.log(B);
Автор решения: Alexander Lonberg
→ Ссылка
Чтоб не создавать новый массив(и не фильтровать) и не проверять каждый элемент, проверяем с помощью has(), только элементы B
function union(a, b) {
const end = b.length - 1
const has = (key) => {
let i = end
while (i--) if (b[i].Key === key) return true
return false
}
for (const item of a) {
has(item.Key) || b.push(item)
}
}
Автор решения: vsemozhebuty
→ Ссылка
Если массивы большие, можно немного оптимизировать по времени ответ @Darth. Создадим вспомогательный Set с ключами из проверяемого массива, чтобы не приходилось обыскивать его в каждой итерации. Но нужно проверять для конкретного случая, чтобы время на создание Set не свело на нет дальнейший выигрыш.
const A = [{key: 1}, {key: 2}, {key: 3}];
const B = [{key: 3}, {key: 4}, {key: 5}];
const bKeys = new Set(B.map(({ key }) => key));
for (const el of A) {
if (!bKeys.has(el.key)) B.push(el);
}
console.log(B);