簡體   English   中英

下划線_.each和_.map之間的區別是什么?

[英]What is really the difference between underscore _.each and _.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只是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函數。

每次調用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()函數返回原始列表,但_.map()返回一個列表。 您可以直接修改原始對象,因此最終會在每個列表中引用相同的對象,但是使用_.map()最終會得到兩個單獨的數組實例。

您可以查看源代碼以查看差異:

  • _.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; }; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM