如何对一个对象数组进行分组并求和?

45

我想在 jQuery 中按 Id 对对象数组进行分组,并对数量进行求和。我该如何实现?

例如:

var array = [
  { Id: "001", qty: 1 },
  { Id: "002", qty: 2 },
  { Id: "001", qty: 2 },
  { Id: "003", qty: 4 }
]

应该产生以下结果:

[
  { Id: "001", qty: 3 },
  { Id: "002", qty: 2 },
  { Id: "003", qty: 4 }
]

这里讨论了一个更新的、支持TypeScript的SO,同时也支持多个分组键。链接 - swimmer
2个回答

119
你可以循环并求和(reduce 文档

var array = [
  { Id: "001", qty: 1 }, 
  { Id: "002", qty: 2 }, 
  { Id: "001", qty: 2 }, 
  { Id: "003", qty: 4 }
];

var result = [];
array.reduce(function(res, value) {
  if (!res[value.Id]) {
    res[value.Id] = { Id: value.Id, qty: 0 };
    result.push(res[value.Id])
  }
  res[value.Id].qty += value.qty;
  return res;
}, {});

console.log(result)

Fiddle: Fiddle


2
将“qty”设置为0在“res[value.Id] = { qty: 0, Id: value.Id};”这一步中非常重要。否则会出现重复值。 - JustLearning
9
这句话的意思是:这里是否应该使用 var result = array.reduce... 而不是使用副作用?我会将其翻译为:Is it preferable to use "var result = array.reduce..." instead of relying on side effects? (“副作用”直接翻译为 "side effect") - mplungjan
我相信这只能工作,因为Id是数字,而数组的索引不能是字符串... - undefined

1
var newArr = [];

$.each(array,function(index,element){
    if(newArr[element.Id]==undefined){
        newArr[element.Id] =0;
    }
    newArr[element.Id] += element.qty;
});
console.log(newArr);

演示


你没有创建一个对象数组。 - mplungjan
这里使用了element.id作为数组索引,而不是对象键。 - treecon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接