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)