我试图从数组“a”中过滤出与数组“b”和“c”中的对象匹配的对象。这是jsfiddle的链接测试代码。
这是我目前拥有的:
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 sort(a, b, c) {
result = [];
console.log(result);
if (b !== null) {
result = a.filter(function(item) {
return !b.includes(item.uq_id);
})
}
if (c !== null) {
result = result.filter(function(item) {
return !c.includes(item.uq_id);
})
}
console.log(result);
}
sort(a, b, c);
我希望得到以下输出:
[{name="sofie", uq_id="abc2"}]
但出于某种原因它输出:
[{name="sondre", uq_id="abc1"},
{name="sofie", uq_id="abc2"},
{name="casper", uq_id="abc3"},
{name="odin", uq_id="abc4"}]
有谁知道我怎样才能让它按我的预期工作?
最佳答案
如果目标是过滤掉 a
中 name
与 b
或 c
中的条目相匹配的条目>,您不能使用 includes
,除非 a
、b
和 c
中的条目引用 < strong>相同对象(不仅仅是等同的对象)。
假设它们不存在,您可以使用 some
来查明数组是否包含与 name
匹配的项。您需要使用 &&
来查看 b
或 c
中没有匹配项:
const filtered = a.filter(entry => {
return !b.some(({name}) => entry.name === name) &&
!c.some(({name}) => entry.name === name);
});
实时复制:
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
真的很大(数十万个条目,也许数百万个)可能效率低到足以证明创建 首先设置
名称:
const names = new Set([
...b.map(({name}) => name),
...c.map(({name}) => name)
]);
const filtered = a.filter(entry => {
return !names.has(entry.name);
});
或者您可能只是出于偏好或清晰度而这样做。
实时复制:
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));
关于javascript - 针对另外两个对象数组过滤一个对象数组时出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56933353/