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

ras*_*adb 3 javascript underscore.js

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

the*_*eye 6

_.contains VS _.some

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

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

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

返回true如果列表中的任何值的传递谓词真相的考验.如果找到true元素,则短路并停止遍历列表.

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

_.each VS _.map

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

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

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

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

_.mapiteratee使用列表中的每个元素调用函数passed()来创建一个新的Array对象,但_.each只是iteratee用每个元素调用函数passed()(注意:这不会创建一个数组).

基本上_.each是功能相当于for (var i = 0; i < array.length; i += 1) {...}.他们俩再次做着不同的工作.


g00*_*00b 5

我认为@thefourtheye的答案足以说明问题,但我认为添加示例也可能有所帮助。

_.contains_.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
Run Code Online (Sandbox Code Playgroud)

我们也可以使用该_.some函数,但是要长一些:

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

但是,假设我们需要检查数组是否包含任何偶数?很难做到这一点,_.contains但是与_.some您一起可以做这样的事情:

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

是的,这里有一个区别,虽然_.contains它主要用于检查数组是否包含特定元素,_.some但可以用于检查数组是否包含具有特定要求的元素。

_.each_.map

这两个循环遍历整个数组,但是它们都有不同的含义。随着_.each它的很简单,你可以通过一个数组循环:

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

_.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, ...
Run Code Online (Sandbox Code Playgroud)

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

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

但这_.map只是一种简便的方法。