为何无法通过参数过滤参数?如何移除destroyer函数传入数组中的指定参数?
关于destroyer函数的问题解答
问题1:为何通过一个参数来过滤其他参数的方式无法生效?
核心原因很简单:你只拿单个额外参数去和数组元素做比较,但需求是要移除所有额外传入的参数呀!
举个例子,假设你一开始写了类似这样的代码:
function destroyer(arr) { // 只拿第二个参数去过滤,后面的参数完全没处理 return arr.filter(item => item !== arguments[1]); }
当你调用destroyer([1,2,3,1,2,3], 2, 3)时,这个函数只会把2过滤掉,3还留在数组里——看起来就像“过滤没生效”。
本质是你没把所有额外参数当成一个集合来判断,而是只针对其中某一个参数做了比较,自然无法覆盖所有需要移除的元素。
问题2:实现destroyer函数,移除数组内的所有额外传入参数
这里有两种实用的实现方式,适配不同场景:
方式1:ES6+推荐写法(Rest参数)
Rest参数可以直接把除第一个数组参数外的所有参数打包成一个数组,代码简洁又清晰:
function destroyer(arr, ...valsToRemove) { // 过滤掉所有存在于移除列表中的元素 return arr.filter(item => !valsToRemove.includes(item)); }
测试一下:调用destroyer([1,2,3,1,2,3], 2, 3)会返回[1,1],完美符合需求。
方式2:兼容旧环境写法(arguments对象)
如果需要兼容ES6之前的运行环境,可以用arguments获取所有参数,再截取掉第一个数组参数:
function destroyer(arr) { // 将arguments转为数组,从索引1开始截取得到要移除的元素列表 const valsToRemove = Array.prototype.slice.call(arguments, 1); return arr.filter(item => valsToRemove.indexOf(item) === -1); }
这里用indexOf替代includes,也是为了兼容更旧的环境,逻辑和第一种完全一致。
要是你的场景里需要处理复杂类型(比如对象),那可能得改成用some配合对象属性比较,但如果只是基本类型(数字、字符串、布尔值等),上面的代码足够用了。
内容的提问来源于stack exchange,提问作者zgthompson
相关产品推荐
相关产品推荐

