我有两个数组(一个键和一个值),我希望将它们组合成一个对象,并在键相同时对值进行求和。
var keys = ['a', 'b', 'a', 'c'];
var values = [1, 2, 2, 3];
我尝试使用lodash zibObject()
,但无法使用此函数对值求和。我想使用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 :(得分: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);
&#13;
<pre id="final"></pre>
&#13;
答案 1 :(得分:1)
使用_.reduce
使用对象作为初始值:
var out = _.reduce(keys, function (p, c, i) {
p[c] = p[c] || 0;
p[c] += values[i];
return p;
}, {});
答案 2 :(得分:1)
_.reduce(keys, function(result, key, index){
result[key] = result[key] ? result[key] + values[index] : values[index];
return result;
}, {})