Если цель состоит в том, чтобы отфильтровать записи из a
, для которых name
соответствует записи в b
или c
, вы не можете использовать includes
, если только записи в a
, b
и c
относятся к одинаковым объектам (не только эквивалентным).
Предполагая, что это не так, вы можете использовать some
, чтобы узнать, содержит ли массив совпадение для name
. Вы можете использовать &&
, чтобы увидеть, что нет совпадений ни в b
, ни в c
:
const filtered = a.filter(entry => {
return !b.some(({name}) => entry.name === name) &&
!c.some(({name}) => entry.name === name);
});
Live Copy:
const a = [{
"name": "sondre",
"uq_id": "abc1"
}, {
"name": "sofie",
"uq_id": "abc2"
}, {
"name": "casper",
"uq_id": "abc3"
}, {
"name": "odin",
"uq_id": "abc4"
}];
const b = [{
"name": "sondre",
"uq_id": "abc1"
}, {
"name": "odin",
"uq_id": "abc4"
}];
const c = [{
"name": "casper",
"uq_id": "abc3"
}];
function filter(a, b, c) {
const filtered = a.filter(entry => {
return !b.some(({name}) => entry.name === name) &&
!c.some(({name}) => entry.name === name);
});
return filtered;
}
console.log(filter(a, b, c));
Это также можно выразить с помощью every
, в зависимости от того, что вы предпочитаете:
const filtered = a.filter(entry => {
return b.every(({name}) => entry.name !== name) &&
c.every(({name}) => entry.name !== name);
});
Если b
и c
действительно больших (сотни тысяч записей, возможно, миллионов), которые могут быть недостаточно эффективными, чтобы оправдать сначала создание Set
имен:
const names = new Set([
...b.map(({name}) => name),
...c.map(({name}) => name)
]);
const filtered = a.filter(entry => {
return !names.has(entry.name);
});
Или вы можете просто сделать это для предпочтения или ясности.
Live Copy:
const a = [{
"name": "sondre",
"uq_id": "abc1"
}, {
"name": "sofie",
"uq_id": "abc2"
}, {
"name": "casper",
"uq_id": "abc3"
}, {
"name": "odin",
"uq_id": "abc4"
}];
const b = [{
"name": "sondre",
"uq_id": "abc1"
}, {
"name": "odin",
"uq_id": "abc4"
}];
const c = [{
"name": "casper",
"uq_id": "abc3"
}];
function filter(a, b, c) {
const names = new Set([
...b.map(({name}) => name),
...c.map(({name}) => name)
]);
const filtered = a.filter(entry => {
return !names.has(entry.name);
});
return filtered;
}
console.log(filter(a, b, c));