如何用.filter()筛选非指定数组元素?为何无法在.filter()中正确使用argArr?
问题分析与修复:过滤数组中的指定元素
核心问题
你代码里的过滤逻辑完全错误:在filter回调里,你拿数组元素i和整个argArr数组对象做!==比较。由于数组是引用类型,即便元素和数组里的值一样,i !== argArr也永远为true——因为你是在拿一个基本类型值和一个数组对象比内存地址,根本不是在判断元素是否属于要排除的集合。
修复后的代码
把判断逻辑改成检查元素是否不在排除列表argArr中,用Array.includes()最直观:
function destroyer(arr) { let argArr = []; for (let i = 1; i < arguments.length; i++) { argArr.push(arguments[i]) } // 关键修改:判断元素是否不在排除列表里 return arr.filter(i => !argArr.includes(i)) } console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3)); // 输出 [1, 1]
简化写法(可选)
可以不用手动循环收集参数,直接用扩展运算符或Array.from提取排除列表:
function destroyer(arr) { // 直接获取第一个参数之后的所有排除项 const excludeItems = [...arguments].slice(1); return arr.filter(item => !excludeItems.includes(item)); }
为什么原逻辑失效
JavaScript中,引用类型(数组、对象等)的全等/不全等比较是基于内存引用的,你拿数字1和数组[2,3]做!==比较,结果必然是true,所以filter会把原数组所有元素都保留下来,完全没起到过滤作用。
内容的提问来源于stack exchange,提问作者Lachlan
相关产品推荐
相关产品推荐

