自定义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

