Underscore的类似功能:_.contains vs. _.some和_.map vs _.each

时间:2015-02-27 06:39:55

标签: javascript underscore.js

是否有理由使用其中一个?似乎_.some和_.map更容易使用或适用于更多情况(从我非常有限的经验),但从阅读它,听起来好像他们应该做同样的事情。我确信还有其他例子,我全神贯注地学习一些比较。

3 个答案:

答案 0 :(得分:5)

_.contains vs _.some

_.contains (_.contains(list, value, [fromIndex])

  

如果列表中存在该值,则返回true。如果list是数组,则在内部使用indexOf。使用fromIndex开始在给定索引处搜索。

_.some (_.some(list, [predicate], [context]))

  

如果列表中的任何值通过谓词真值测试,则返回true。如果找到了真正的元素,则短路并停止遍历列表。

_.some_.contains之间的主要区别在于,contains检查给定列表中是否存在给定项目,some检查是否存在任何元素该列表满足传递的谓词。所以,他们都在做不同的任务。

_.each vs _.map

_.each (_.each(list, iteratee, [context])

  

迭代一系列元素,然后依次产生一个迭代函数。

_.map (_.map(list, iteratee, [context])

  

通过转换函数(iteratee)映射列表中的每个值,生成一个新的值数组

_.map调用传递的函数(iteratee)与列表的每个元素一起创建一个新的Array对象,但_.each只调用传递的函数(iteratee })与每个元素(注意:这不会创建一个数组)。

基本上_.eachfor (var i = 0; i < array.length; i += 1) {...}的功能等价物。同样,他们都在做不同的工作。

答案 1 :(得分:4)

我认为@ thefourtheye的答案解释得很充分,但我认为添加一个例子也可能有所帮助。

_.contains vs _.some

这里最大的区别是_.contains允许您提供值和索引,而_.some允许您提供谓词。

因此,举例来说,我们假设我们有一个包含前10个数字[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]的数组,我们如何检查数组是否包含数字5?

我们可以使用_.contains函数:

_.contains([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 5); // True

我们也可以使用_.some功能,但它会更长一点:

_.some([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(num) {
  return num === 5;
}); // True

但是,让我们说我们需要检查数组是否包含任何偶数?使用_.contains很难做到这一点,但使用_.some你可以做到这样的事情:

_.some([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(num) {
  return num % 2 === 0;
});

所以是的,这里有区别,而_.contains主要用于检查数组是否包含特定元素,_.some可用于检查数组是否包含元素具体要求。

_.each vs _.map

这两个循环遍历整个数组,但它们都有不同的含义。使用_.each非常简单,您可以遍历数组:

_.each([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(num) {
  console.log(num); // Will print each number
});

另一方面_.map函数允许您返回某些内容,它允许您数组映射到新数组。让我们说你想要一个每个数字的数组乘以2,嗯,你可以用_.map做到这一点:

var newCollection = _.map([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(num) {
  return num * 2;
});
console.log(newCollection); // Will contain the numbers 2, 4, 6, 8, ...

是的,您可以通过_.each循环执行此操作,并执行以下操作:

var newCollection = [];
_.each([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(num) {
  newCollection.push(num * 2);
});
console.log(newCollection);

_.map只是一种简单易行的方式。

答案 2 :(得分:2)

1)_.contains vs _.some

我认为,可以说__contains是_.some的特例。 也就是说,

_.contains( list, value ) 

的快捷方式
_.some( list, function ( el ) { return value == 3; })

第二种变体太冗长了。

lodash中,许多函数都提供了这些有用的快捷方式,例如:

var users = [
    { 'user': 'barney', 'age': 36, 'active': true },
    { 'user': 'fred',   'age': 40, 'active': false }
];

_.contains({ 'user': 'fred', 'age': 40 }, 'fred');

_.filter(users, { 'age': 36 });

2)_. map vs _.each

这些功能完全不同。 _.map用于集合转换。如果输入的大小为N,则_.map的结果的大小也为N.换句话说,_. map是表达式 - 当您需要转换输入集合的每个元素时使用它。 _.each只是 for 循环的快捷方式。这很有用,因为您不需要像

那样计算数组的长度
for (var i = 0, len = myArray.length; i < len; i++ ) {
}

当您正确使用_.map或_.each时,您明确声明您的意图。