我有关于实施_.every()的问题。
我的代码在这里
_.every = function(collection, iterator) {
if (collection.length === 0) {
return true;
}
return _.reduce(collection, function(accum, item){
if(!iterator(item)){
return false;
} else if((iterator(item))){
return accum;
}
},true);
};
但是,根据Underbar Test Suite,我的代码不适用于“在没有提供回调时应该工作”的声明
expect(_.every([true, true, true])).to.be.true;
expect(_.every([true, true, false])).to.be.false;
expect(_.every([false, false, false])).to.be.false;
我不知道我的代码有什么问题。
请让我知道热情来纠正它。
答案 0 :(得分:1)
如果您未通过iterator
回调,请查看会发生什么。
_.every = function(collection, iterator) { // <-- iterator is undefined
if (collection.length === 0) {
return true;
}
return _.reduce(collection, function(accum, item){
if(!iterator(item)){ // <-- undefined is not a function! This will throw an error!
return false;
} else if((iterator(item))){
return accum;
}
},true);
};
要解决此问题,您需要检查是否已定义iterator
,然后再进行调用。否则,请根据您的收集项进行一些其他测试。
或者,您可以为迭代器提供默认值。这个解决方案可能更简单:
_.every = function(collection, iterator) { // <-- iterator is undefined
if (collection.length === 0) {
return true;
}
// overwrite iterator if it's falsy (in your case it's undefined)
iterator = iterator || function(item) {
return item;
};
return _.reduce(collection, function(accum, item){
if(!iterator(item)){
return false;
} else if((iterator(item))){
return accum;
}
},true);
};