我对实现_.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/

10-12 07:37