Array.filter
в сочетании с не Array.some
.
Хитрость здесь также в том, чтобы не some
, ..
const arr1 = [
{id: 1, name: "a"},
{id: 2, name: "b"},
{id: 3, name: "c"},
{id: 4, name: "d"},
], arr2 = [
{id: 1, name: "a"},
{id: 4, name: "d"},
];
const newArray=arr1.filter(a=>!arr2.some(s=>s.id===a.id));
console.log(newArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Как уже упоминалось в комментариях, вопрос можно интерпретировать немного по-другому. Если вы также хотите получить ненужные элементы из arr2, вы просто делаете это дважды и присоединяетесь. IOW: проверить, что не в arr2 находится в arr1, а затем проверить, что не в arr1, что в arr2.
например ..
const notIn=(a,b)=>a.filter(f=>!b.some(s=>f.id===s.id));
const newArray=[...notIn(arr1, arr2), ...notIn(arr2, arr1)];
Обновление 2: сложность времени, как упомянуто qiAlex внутри петель есть петли. Хотя some
будет короткое замыкание при поиске совпадения, если набор данных становится большим, вещи могут замедлиться. Это были Set
и Map
.
Итак, чтобы исправить это с помощью Set
.
const notIn=(a,b)=>a.filter(a=>!b.has(a.id));
const newArray=[
...notIn(arr1, new Set(arr2.map(m=>m.id))),
...notIn(arr2, new Set(arr1.map(m=>m.id)))
];