如何用Array.prototype实现all方法?求助修正错误代码
解决Array.prototype.all方法的实现问题
先看你写的代码:
Array.prototype.all = function(callback){ for(let i = 0; i < this.length; i++){ if(this[i] < 10) return true; } if(this[i] < 2) return false; } }
这段代码存在几个关键问题:
- 完全没用到传入的
callback函数,硬写死了判断条件,完全偏离需求 - 循环结束后
i等于数组长度,this[i]是undefined,此时判断this[i] < 2既无意义还会引发错误 - 逻辑完全搞反:你现在是第一个元素满足条件就直接返回true,但需求是所有元素都通过回调验证才返回true,只要有一个不满足就返回false
正确的实现思路:
- 遍历数组的每一个元素
- 对每个元素调用传入的
callback,将当前元素作为参数传入 - 只要有一个元素调用
callback后返回false,立刻返回false - 遍历完所有元素都没触发返回,就返回true
按照思路写出的代码:
Array.prototype.all = function(callback) { for (let i = 0; i < this.length; i++) { // 调用传入的回调,传入当前元素 if (!callback(this[i])) { // 有元素不满足条件,直接返回false return false; } } // 所有元素都满足,返回true return true; }
测试示例:
[1,2,3].all(elem => elem < 10):所有元素都小于10,遍历结束后返回true[1,2,3].all(elem => elem < 2):第二个元素2不满足条件,遍历到它时直接返回false,符合需求
如果想简化写法,也可以直接复用数组原生的every方法(适合快速实现,但手动循环更利于理解原理):
Array.prototype.all = function(callback) { return this.every(callback); }
内容的提问来源于stack exchange,提问作者lulu
相关产品推荐
相关产品推荐

