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

自定义Array.prototype.myFilter测试失败,求解释参数传递逻辑

自定义Array.prototype.myFilter为何要传入三个参数给回调?

我尝试不使用内置filter方法实现Array.prototype.myFilter(),要求和原生filter功能完全一致。我的代码通过了大部分测试,但有一个测试用例失败。看到正确实现里的callback(this[i], i, this)参数传递,我不太理解为什么要传这三个参数。

相关代码

题目初始代码

Array.prototype.myFilter = function(callback) {
  const newArray = [];
  // Only change code below this line

  // Only change code above this line
  return newArray;
};

我的实现代码

for(let i = 0; i < this.length; i++){
  if(callback(this[i])){
  newArray.push(this[i])
  }
}

正确实现代码

for(let i = 0; i < this.length; i++){
  if(Boolean(callback(this[i], i, this)) === true){
  newArray.push(this[i])
  }
}

测试用例结果

Passed:[23, 65, 98, 5, 13].myFilter(item => item % 2) should equal [23, 65, 5, 13].
Passed:["naomi", "quincy", "camperbot"].myFilter(element => element === "naomi") should return ["naomi"].
Failed:[1, 1, 2, 5, 2].myFilter((element, index, array) => array.indexOf(element) === index) should return [1, 2, 5].
Passed:Your code should not use the filter method.

问题解析

原生Array.prototype.filter()的回调函数本来就会接收三个参数:

  • 当前遍历到的元素(element)
  • 当前元素的索引(index)
  • 调用filter的原数组(array)

你失败的那个测试用例,回调函数正好用到了第三个参数array——它通过array.indexOf(element)获取元素第一次出现的索引,和当前索引index对比,目的是筛选出数组中的唯一值(去重)。

你的实现只传了第一个参数,导致回调里的array是undefined,调用array.indexOf()直接报错,自然无法通过测试。

另外,正确实现里用Boolean(...)包装回调结果,是为了确保回调返回的任意值都被转为布尔类型,这也和原生filter的行为一致——原生filter会把回调的返回值转为布尔值,再判断是否保留当前元素。

内容的提问来源于stack exchange,提问作者Meigu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:25:14