Underscore _.every()方法实现求助:无回调场景测试不通过
解决_.every()方法无回调时的测试问题
嘿,我来帮你排查这个问题~你的代码核心问题是没有处理未传入iterator回调函数的场景,而且现有逻辑里的一些冗余写法也可以优化。
问题分析
当测试用例不传iterator时,你的代码里直接调用iterator(item)会导致iterator是undefined,触发报错;同时Underscore的_.every()默认行为是:如果没有回调,就检查集合里的每一个元素本身是否为真值(即转换为布尔值后为true)。
另外你代码里的reduce逻辑有冗余:else if((iterator(item))) return accum;完全可以简化,因为只要前面的!iterator(item)不成立,就说明当前元素符合条件,直接返回之前的累积值accum即可。
修正后的代码
_.every = function(collection, iterator) { // 处理iterator默认值:不传时,默认返回元素自身的布尔值 iterator = iterator || function(item) { return !!item; }; if (collection.length === 0) { return true; } return _.reduce(collection, function(accum, item){ // 如果当前元素不满足条件,直接返回false(终止后续判断) if (!iterator(item)) { return false; } // 否则保持累积的结果(只要之前都是true,就继续返回true) return accum; }, true); };
改动说明
- 添加默认回调:当
iterator未传入时,用function(item) { return !!item; }作为默认逻辑,确保每个元素会被转换为布尔值进行判断,符合Underscore的默认行为。 - 简化reduce逻辑:去掉冗余的
else if分支,只要当前元素符合条件,就直接返回累积值accum,逻辑更清晰。
现在再跑你的测试用例:
_.every([true, true, true])会用默认回调,每个元素都是true,返回true_.every([true, true, false])遇到false时返回false_.every([false, false, false])第一个元素就触发返回false
完全符合测试要求啦~
内容的提问来源于stack exchange,提问作者WonBok Lee
相关产品推荐
相关产品推荐

