是否有理由使用其中一个?似乎_.some和_.map更容易使用或适用于更多情况(从我非常有限的经验),但从阅读它,听起来好像他们应该做同样的事情。我确信还有其他例子,我全神贯注地学习一些比较。
答案 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
})与每个元素(注意:这不会创建一个数组)。
基本上_.each
是for (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时,您明确声明您的意图。