2014-08-28 67 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; 
    }; 
    
相關問題