2014-08-28 62 views
20

我正在使用UnderscoreJs。考虑以下代码:下划线_.each和_.map之间的区别是什么?

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这里没关系。结果是完全一样的。

在上述情况下两者的区别究竟是什么?

+1

什么库,下划线? – Mritunjay 2014-08-28 15:48:45

+1

阅读[the manpage](http://documentcloud.github.io/underscore/docs/underscore.html#section-13),查找起来并不难。 – Nit 2014-08-28 15:50:11

+1

'_.each()'*迭代*,'_.map()'* projects *,即使用您指定的函数来构建新元素,从作为输入传递的那个构建一个新数组。 – 2014-08-28 15:50:22

回答

27

map旨在是一个功能性映射方法:其功能参数应该返回一个值,但预计不会有任何副作用

each仅仅是当务之急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. 
7

_.each(列表,iteratee)

在迭代元素的列表,得到各依次的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(列表,iteratee)

通过变换函数(iteratee)映射在列表中的每个值将产生的值的一个新的数组。

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

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

看到documentation

2

你的说法,结果是“完全相同“是不真实的。​​函数返回的原始列表,但_.map()返回的新的列表。您直接修改原始对象,因此最终会引用每个列表中的相同对象,但最终会得到两个单独的数组实例。

3

您可以只查看源代码,看看差别:

  • _.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; 
    }; 
    
相关问题