下划线_.each和_.map之间的区别是什么?

我正在使用UnderscoreJs。 考虑这个代码:

var docs = [ {name : 'Anders', niche : 'Web Development'}, {name : 'Johnny', niche : 'Design'}, {name : 'Eric', niche : 'PhotoShop'} ]; var newDocs = _.map(docs, function (doc){ delete doc.niche; return doc; }); 

如果我在这里使用.each.map没关系。 结果是完全一样的。

在上述情况下,两者究竟有什么区别?

map是一个函数映射方法:它的函数参数应该返回一个值,但不会有任何副作用

each都只是一个function性的替代品, for循环:它的目的是产生效果,并且不期望返回任何价值

例如,这将是一个更合适的map使用:

 var docs = getDocs(); var docTitles = _.map(docs, function (doc){ return doc.title; }); // expect `docs` to be unchanged 

而这将是each适当的使用:

 var docs = getDocs(); _.each(docs, function (doc){ delete doc.niche; }); // expect `docs` to be altered. 

_each(list,iteratee)

迭代元素列表,依次产生迭代函数。

iteratee的每个调用都有三个参数调用:(element,index,list)。 如果list是一个JavaScript对象,iteratee的参数将是(value,key,list)。 返回链接列表。

 _.each({one: 1, two: 2, three: 3}, alert); => alerts each number value in turn... 

_.map(list,iteratee)

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

如果list是一个JavaScript对象,iteratee的参数将是(value,key,list)。

 _.map({one: 1, two: 2, three: 3}, function(num, key){ return num * 3; }); => [3, 6, 9] 

见文档

你可以看看源代码来看看不同之处:

  • _.each

     _.each = _.forEach = function(obj, iteratee, context) { if (obj == null) return obj; iteratee = createCallback(iteratee, context); var i, length = obj.length; if (length === +length) { for (i = 0; i < length; i++) { iteratee(obj[i], i, obj); } } else { var keys = _.keys(obj); for (i = 0, length = keys.length; i < length; i++) { iteratee(obj[keys[i]], keys[i], obj); } } return obj; }; 
  • _.map

     _.map = _.collect = function(obj, iteratee, context) { if (obj == null) return []; iteratee = _.iteratee(iteratee, context); var keys = obj.length !== +obj.length && _.keys(obj), length = (keys || obj).length, results = Array(length), currentKey; for (var index = 0; index < length; index++) { currentKey = keys ? keys[index] : index; results[index] = iteratee(obj[currentKey], currentKey, obj); } return results; }; 

你的断言结果是“完全一样的”是不真实的。 _.each()函数返回原始列表,但_.map()返回一个列表。 您直接修改原始对象,所以最后引用了每个列表中的相同对象,但使用_.map()最终会得到两个单独的数组实例。