You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法通过参数过滤参数?如何移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:54:58