我有一个名为one
的数组,其中包含具有属性的对象列表:
[
{ id: "1"},
{ id: "2"},
{ id: "3"}
]
然后我有另一个名为two
的数组,其中包含ID引用列表:
["1", "8"]
我想从数组one
中删除具有与数组two
相同ID的项,所以我这样做了:
result = one.filter(function (el) {
return two.find(item => item == el.id) < 0;
});
这将返回一个空数组,但应返回:
[
{ id: "2"},
{ id: "3"}
]
答案 0 :(得分:4)
result = one.filter(function (el) {
return two.find(item => item == el.id) < 0;
});
如果未找到该元素,则two.find
将返回未定义。 undefined < 0
解析为false,因此不包含该元素。
也许您打算使用findIndex
而不是find
。在这种情况下,缺少元素将导致-1。
const one = [
{ id: "1"},
{ id: "2"},
{ id: "3"}
]
const two = ["1", "8"]
const result = one.filter(function (el) {
return two.findIndex(item => item == el.id) < 0;
});
console.log(result);
答案 1 :(得分:2)
如果您需要更快的版本...
const result = one.filter((s => el => !s.has(el.id))(new Set(two)));
那是O(n)而不是O(n * m)
答案 2 :(得分:2)
您可以排除{{1}}在不需要的数组中的对象。
{{1}}
答案 3 :(得分:1)
result = one.filter(function (el) {
return (two.indexOf(el.id) == -1);
});
答案 4 :(得分:1)
Array.find
返回undefined
。
因此删除数字比较,并在其前面加上NOT(!)运算符。
const one = [
{ id: "1"},
{ id: "2"},
{ id: "3"}
]
const two = ["1", "8"]
const result = one.filter(function (el) {
return !two.find(item => item == el.id)
})
console.log(result)
但是,我会使用Array.includes
,它会更简洁一些。
const one = [
{ id: "1"},
{ id: "2"},
{ id: "3"}
]
const two = ["1", "8"]
const result = one.filter(item => !two.includes(item.id))
console.log(result)
答案 5 :(得分:1)
改为使用.indexOf()
。如果返回-1,则表示该元素不存在于数组中
var one = [
{ id: "1"},
{ id: "2"},
{ id: "3"}
]
var two = ["1", "8"]
var result = one.filter(function (el) {
return two.indexOf(el.id) === -1;
});
console.log(result)