下划线_.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()
最终会得到两个单独的数组实例。