Как добавить новые значения из одного массива в другой

Есть массивы 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);

→ Ссылка