2013-05-01 51 views
0

嗨,我是underscore.js的新手,我試圖弄清楚如何在地圖上執行操作。我通讀了API,恐怕我錯過了一些東西。Underscore.js在對象上執行操作,而不是數組

這是我想做什麼:

doubled = _.someFunction({ bob: 25, sally: 30, tom: 5 } 
          , function(value){ return value*2; } 
         ); 

返回:

{ bob: 50, sally: 60, tom: 10 } 

任何想法如何做到這一點?我應該用_.mixin()創建一個新功能嗎?

回答

1

沒有,下劃線確實沒有爲對象提供一個map功能。 (您可以使用對象_.map,但它會返回一個數組)

所以,你必須手動完成:

_.someFunction = function(o, f) { 
    var res = {}; 
    for (var p in o) 
     res[p] = f(o[p]); 
    return res; 
}; 

當然,你可能會使用一些迭代函數從下劃線。如果沒有一個輔助功能,這些片段可能會或多或少表現:

var doubled = {}; 
_.each({ bob: 25, sally: 30, tom: 5 }, function(p, value){ 
    doubled[p] = value*2; 
}); 
var doubled = _.reduce({ bob: 25, sally: 30, tom: 5 }, function(m, value, p){ 
    m[p] = value*2; 
    return m; 
}, {}); 
var obj = { bob: 25, sally: 30, tom: 5 }; 
var doubled = _.object(
    _.keys(obj), 
    _.map(_.values(obj), function(value){ return value*2; }) 
); 
+0

這就是我需要的。看看我去了下面。 – redolent 2013-05-02 00:40:15

2

你可以做一個雙重功能如下:

function double(data) { 

    var doubled = {}; 

    _.each(data, function(value, key) { 
    doubled[key] = 2 * value; 
    }); 

    return doubled; 

}; 

double({ bob: 25, sally: 30, tom: 5 }); 
+1

如果我設置了'_.double = double'就可以了。 – redolent 2013-05-01 18:49:27

1

對於那些有興趣,這裏是我落得這樣做:(見reduce function API

_.mapValues = function(object, iterator, context){ 
    if (context) iterator = _.bind(iterator, context); 
    return _.reduce( 
      object 
     , function(memo, value, key){ 
       memo[key] = iterator(value, key); 
       return memo; 
       } 
     , {}) 
}; 
+0

'上下文'?它不應該是'func.call(context,value,key)'嗎? – Bergi 2013-05-02 00:45:24

+0

EDITED。我不得不爲他們爭取他們的來源。我複製了他們使用的代碼行。 – redolent 2013-05-02 04:53:26

相關問題