Javascript 无法找出列表筛选器工作不正常的原因

Javascript 无法找出列表筛选器工作不正常的原因,javascript,Javascript,考虑一下这个代码 const b = { users: [ { "name": "bob", "id": 0 }, { "name": "sam", "id": 1 }, { "name": "tom", "id&

考虑一下这个代码

const b = {
  users: [
    {
      "name": "bob",
      "id": 0
    },
    {
      "name": "sam",
      "id": 1
    },
    {
      "name": "tom",
      "id": 2
    },
  ]
}

const include = [1]
const c = b.users.filter(user => user.id in include)
console.log(c)
在我的数组
include
中,我有一个数字1,它引用用户对象中的id。c应该返回“sam”一个,但返回id为0的“bob”。我不明白为什么

 > console.log(c)
 users: [
 {
     "name": "bob",
     "id:" 0
 }]

中的
操作符检查对象中是否存在给定的

例如:

constobj={a:1,b:2,c:3}
console.log('a'在obj中)//true
console.log('x'在obj中)//false
数组
[1]
作为对象查看时,看起来类似于
{0:1,length:1,…}

[1]
中的
0将为真(因为
[1][0]
存在-它是第一个也是唯一的元素),但[1]
中的
1将为假(因为
[1][1]
不存在,它将是第二个元素)

要检查数组是否包含特定的,您需要
array.prototype.includes

const c=b.users.filter(user=>include.includes(user.id))
改用
Array#includes

const c = b.users.filter(user => include.includes(user.id))
更好的方法是使用效率更高的
集合

const include = new Set([1])
const c = b.users.filter(user => include.has(user.id))

再加上另一个反应

获得
bob
的原因是
in
如果在索引中找到值,则返回true/false

过滤器中
,如果user.id为
0
,则include中的
user.id返回true,否则返回false,因为
include
常量的长度为1,
include[0]
返回
1

看看这个:

您可以通过console.log查看过滤器中生成的结果:

const include = [1]
const c = b.users.filter(user => {
  console.log(user.id in include);
  return user.id in include
  })
console.log(c)

或数组对象的键。由于[1]
中的
0是真实的,所以OP可能会使用
中的
遇到意外行为,这就是我所描述的。数组也是一个对象。
// Arrays
let trees = ['redwood', 'bay', 'cedar', 'oak', 'maple']
0 in trees        // returns true
3 in trees        // returns true
6 in trees        // returns false
const include = [1]
const c = b.users.filter(user => {
  console.log(user.id in include);
  return user.id in include
  })
console.log(c)