var data = [ {id:1, qty:100}, {id:2, qty:200}, {id:1, qty:100}, {id:2, qty:200} ];
如何将此数组求和为[ {id:1, qty:200}, {id:2, qty:400} ];
THX。
答案 0 :(得分:4)
试试这个:
var sum = [];
data.forEach(function(o) {
var existing = sum.filter(function(i) { return i.id === o.id })[0];
if (!existing)
sum.push(o);
else
existing.qty += o.qty;
});
请参阅Fiddle
答案 1 :(得分:1)
使用Ramda
:
var f = R.compose(
R.values(),
R.mapObj(R.reduce(function(a,b) {return {'id': b.id, 'qty':a.qty+b.qty}}, {qty:0})),
R.groupBy(R.prop('id'))
);
var data = [ {id:1, qty:100}, {id:2, qty:200}, {id:1, qty:100}, {id:2, qty:200} ];
console.log(f(data));
答案 2 :(得分:0)
我没有对任何数据运行此操作,但逻辑似乎正确。基本上这个代码遍历你的数组,对于每个唯一的实例,它会将值存储到一个临时数组中,并在原始数组上写入结果。
var temp = [];
temp.push(data[0])
for (x = 1; x < data.length; x++){
for (i = 0; i < temp.length; i++){
if (temp[i].id != data[x].id && temp[i].qty != data[x].qty ){
temp.push[data[x]];
}
}
}
data = temp;
答案 3 :(得分:0)
您可以使用功能方式,使用 .reduce()和 .map()方法。
在我的例子中,我已经发挥了一个功能,使这个过程更加通用。
var data = [ {id:1, qty:100}, {id:2, qty:200}, {id:1, qty:100}, {id:2, qty:200} ];
function reducer(data, groupBy, reduceValue){
//Reduce your data and initialize it with an empty object
return [].concat.apply(data.reduce(function(hash, current){
//If hash get current key, retrieve it and add sum property
hash[current[groupBy]] = (hash[current[groupBy]] || 0) + current[reduceValue];
//Return our current hash
return hash;
}, {})).map(function(elm){
//Retrieve object keys
return Object.keys(elm).map(function(key){
//Build our object
var obj = {};
obj[groupBy] = +key;
obj[reduceValue] = elm[key];
return obj;
});
})[0];
}
console.log(reducer(data, 'id', 'qty'));
//[ {id:1, qty:200}, {id:2, qty:400} ];
此函数需要3个参数