在JavaScript中聚合记录

时间:2016-10-30 14:59:55

标签: javascript arrays object

给定一组代表一系列交易的对象,即

[{ person: 'a', sweets: 5 }, { person: 'b', sweets: 8 }, { person: 'a', sweets: 6 }]

如何有效地将这些记录合并到每个人的总计数中,即:

[{ person: 'a', sweets: '11'}, { person: 'b', sweets: 8 }]

是否有一些我不知道的内置功能,或者我是否需要原型?

2 个答案:

答案 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解决方案,使用哈希表来阻止第二个循环,基本上它更有效率。