我对实现 _.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 测试套件,我的代码不适用于“在不提供回调时应该工作”的语句
expect(_.every([true, true, true])).to.be.true;
expect(_.every([true, true, false])).to.be.false;
expect(_.every([false, false, false])).to.be.false;
我不知道我的代码有什么问题。
请让我知道如何纠正它。
最佳答案
看看如果不传递迭代器
回调会发生什么。
_.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);
};
<小时/>
为了解决这个问题,您需要检查是否定义了迭代器,然后调用它。否则根据您的收藏项目进行一些其他测试。
或者,您可以为迭代器提供默认值。这个解决方案可能更简单:
_.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/