我对实现_.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;
我不知道我的代码有什么问题。
请让我知道很热,以纠正它。
最佳答案
看看如果不通过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);
};
关于javascript - 实现下划线_.every(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48124978/