给定一组代表一系列交易的对象,即
[{ person: 'a', sweets: 5 }, { person: 'b', sweets: 8 }, { person: 'a', sweets: 6 }]
如何有效地将这些记录合并到每个人的总计数中,即:
[{ person: 'a', sweets: '11'}, { person: 'b', sweets: 8 }]
是否有一些我不知道的内置功能,或者我是否需要原型?
答案 0 :(得分:2)
您可以使用哈希表进行分组和求和。
var data = [{ person: 'a', sweets: 5 }, { person: 'b', sweets: 8 }, { person: 'a', sweets: 6 }],
grouped = [];
data.forEach(function (a) {
if (!this[a.person]) {
this[a.person] = { person: a.person, sweets: 0 };
grouped.push(this[a.person]);
}
this[a.person].sweets += a.sweets;
}, Object.create(null));
console.log(grouped);

答案 1 :(得分:0)
没有任何内置功能。你必须使用两个循环。首先,您需要遍历原始数组,并且对于该循环的每次迭代,您需要遍历最终数组以找到要更新的正确位置。我会做这样的事情(我没有测试这个解决方案):
var arrayStart = [{ person: 'a', sweets: 5 }, { person: 'b', sweets: 8 }, { person: 'a', sweets: 6 }]
var arraySum = [];
arrayStart.forEach(function(valueStart, indexStart){
var found = false;
for(var i = 0; i < arraySum.length; i++){
if(arraySum[i].person == valueStart.person){
found = true;
arraySum[i].sweets += valueStart.sweets;
break;
}
}
if(!found){
arraySum.push(valueStart);
}
});
console.log(arraySum);
你也可以使用@NinaScholz解决方案,使用哈希表来阻止第二个循环,基本上它更有效率。