下划线包含从头开始?

时间:2015-08-04 17:53:05

标签: javascript underscore.js contains

对于练习,我正在研究下划线包含从头开始。代码的一部分是我无法表达或理解的。这一行做了什么:

“return item === target;”

代码:

_.contains = function(collection, target) {

    return _.reduce(collection, function(wasFound, item) { 
      if (wasFound) { 
        return true;
  }
      return item === target;
    }, false); 

};

2 个答案:

答案 0 :(得分:1)

它只是从回调函数返回一个布尔值AND。表达式reduce的结果是布尔值(即,item === targettrue)。它是一种简洁的(IMO)更优雅的方式,可以做到以下几点:

false

if(item === target) { return true; } else { return false; } 是"严格等于",这意味着它不会执行任何类型强制。这就是===将返回"2" == 2的原因,因为true可以强制转换为数字"2"(反之亦然)。但2将返回"2" === 2,因为它不执行任何类型强制,并且这两个参数的类型不同。

false函数通过迭代集合中的每个元素并计算在每次迭代中也使用的某种值来工作。

在初次调用reduce函数期间,reduce设置为wasFound(注意false传入false后调用reduce打回来)。第一个if将不会被满足,因此该函数将执行return语句。返回的值将是 next 迭代中wasFound new 值。

这意味着只要wasFoundfalse,我们就会尝试查看下一个元素是否与传入的元素匹配。如果是true,则表示我们找到了我们想要的元素,因此我们可以继续返回true

IMO这个函数效率有点低,因为它一旦找到了它正在寻找的元素就不会提前爆发,并且无论如何遍历整个集合。

答案 1 :(得分:1)

if (wasFound) { 
    return true;
}

您正在浏览该集合,并且已找到该项目,您将返回true。

return item === target;

否则,如果当前item等于target正在搜索您,则返回true;如果不是,则返回false