JS使用filter与some按属性列表删除数组元素不生效问题咨询
问题原因说明
1. 关于some()方法的行为疑问
some()仅会在找到第一个满足条件的元素后,终止当前这一轮对bar数组的遍历,直接返回布尔值给上层的filter()回调,完全不会影响filter()对整个foo数组的遍历,你猜测的「终止整个filter运行」是错误的。
2. 逻辑不生效的核心原因
你的判断条件写反了,当前代码的逻辑是:
只要bar数组中存在任意一个id不等于当前user的userId,就保留该user元素
当bar有多个元素时,比如示例里的[1,2]:
- 对userId=1的元素,bar中存在2≠1,
some()返回true,元素被保留 - 对userId=2的元素,bar中存在1≠2,
some()返回true,元素被保留 - 对userId=3、4的元素,bar中所有元素都不等于其userId,
some()也返回true,元素被保留
最终就出现了所有元素都被保留的问题。而当bar只有1个元素时,刚好逻辑碰对了:比如bar=[1],对userId=1的元素,bar里没有不等于1的id,some返回false,就被过滤掉;其他元素bar里的1不等于他们的id,some返回true被保留,刚好符合你的预期,所以才会出现「bar只有一个元素时正常」的错觉。
3. 正确实现
你需要的逻辑是:如果bar中存在任意一个id等于当前user的userId,就剔除该元素,对应两种写法:
写法1:使用some()(符合你原来的技术选型)
console.log(foo.filter(user => !bar.some(id => id === user.userId)));
写法2:使用includes()(更简洁直观)
console.log(foo.filter(user => !bar.includes(user.userId)));
两种写法运行后都会输出你预期的结果:
[ { "userId": 3 }, { "userId": 4 } ]
内容的提问来源于stack exchange,提问作者ProbDed
相关产品推荐
相关产品推荐

