2016-02-18 78 views
0

我有兩個數組(鍵和一個數值),當我想將鍵組合到一個對象中,並且在鍵相同時對數值進行求和。lodash - 將兩個數組合併到對象中

var keys = ['a', 'b', 'a', 'c']; 
var values = [1, 2, 2, 3]; 

我一直在使用lodash zibObject() tryed但沒有辦法來總結這一功能的價值。我想使用zipWith()將是解決方案,但我不知道如何總結。

var grouped = _.zipWith(keys, values, function(a,b){ 
    return {a: b}; // not summing: [{a: 1}, {b: 2}, {a, 2}, {c: 3}] 
}); 

,但我要的是:

var result = { 
    a: 3, 
    b: 2, 
    c: 3 
}; 

什麼是實現與lodash的正確方法?

+0

目前尚不清楚你想要做什麼。我看不出鍵和值數組是如何連接在一起的。你是怎麼得到'a'是3,'b'是2,'c'是3? – DerekMT12

+0

我編輯了問題 –

回答

1
_.reduce(keys, function(result, key, index){ 
    result[key] = result[key] ? result[key] + values[index] : values[index]; 
    return result; 
}, {}) 
+0

稍好於@Andy回答 –

1

使用_.reduce使用對象作爲初始值:

var out = _.reduce(keys, function (p, c, i) { 
    p[c] = p[c] || 0; 
    p[c] += values[i]; 
    return p; 
}, {}); 

DEMO

+1

如果性能很重要,看起來[香草最快](http://jsperf.com/merge-sum-arrays) –

2

而不lodash或下劃線

var keys = ['a', 'b', 'a', 'c']; 
 
var values = [1, 2, 2, 3]; 
 
var grouped = {}; 
 

 
if (keys.length !== values.length) throw "array don't match!!" 
 
for (var i = 0, len = keys.length; i < len; i++) { 
 
    grouped[keys[i]] = grouped[keys[i]] + values[i] || values[i]; 
 
} 
 
document.getElementById('final').innerHTML = JSON.stringify(grouped);
<pre id="final"></pre>

相關問題