实现下划线_.every()

时间:2018-01-06 06:44:49

标签: javascript

我有关于实施_.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;

我不知道我的代码有什么问题。

请让我知道热情来纠正它。

1 个答案:

答案 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);
};