筛选器无法与没有属性的数组一起使用

时间:2019-01-29 14:39:13

标签: javascript

我有一个名为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"}
]

6 个答案:

答案 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)