如何同时使用filter和find方法正确筛选数组排除指定ID元素?
问题根因
你现有代码的逻辑错误来自对find方法返回规则的误用:
Array.find()会返回数组中第一个匹配判断条件的元素,全程没有匹配项时才会返回undefined(假值)- 你当前写的判断条件
coupon.coupon_id !== id,只要nums里存在任意一个值和当前优惠券id不相等,find就会返回这个数值(真值),最终导致filter错误保留本应被过滤的条目。
举个实际运行的反例:当遍历到coupon_id为17022的条目时,nums里第一个值17022和它相等、不满足!==判断,会继续匹配第二个值17027,此时17022 !== 17027成立,find直接返回17027(真值),这个本应被过滤的条目就被错误保留了。
正确实现(同时使用filter+find)
你的核心筛选规则是:保留coupon_id不在nums排除列表里的条目,因此find的作用应该是查找「nums中是否存在和当前coupon_id相等的值」,如果找不到(返回假值undefined),说明该条目不需要被过滤。
对应代码如下:
const couponsNew = coupons.filter(coupon => { // 查找当前优惠券id是否在排除列表nums中,不存在则保留 return !nums.find(id => coupon.coupon_id === id) })
运行后得到的couponsNew会包含coupon_id为17024、17025、17026的三个对象,完全符合预期。
补充:如果不强制要求使用
find,用!nums.includes(coupon.coupon_id)做判断语义会更简洁,执行效率也更高。
内容的提问来源于stack exchange,提问作者user17433593
相关产品推荐
相关产品推荐

