Javascript 按值求可变长度的对象数组的和

Javascript 按值求可变长度的对象数组的和,javascript,arrays,Javascript,Arrays,对不同长度的对象数组求和的最佳方法如下: data = [{"category":"category1","months":{"1":34,"2":67,"3":29,...} {"category":"category2","months":{"1":34,"2":627,"3":292,...} {"category":"category3","months":{"1":46,"2":665,"3":129,...} {"category":"category4","months":{"1"

对不同长度的对象数组求和的最佳方法如下:

data = [{"category":"category1","months":{"1":34,"2":67,"3":29,...}
{"category":"category2","months":{"1":34,"2":627,"3":292,...}
{"category":"category3","months":{"1":46,"2":665,"3":129,...}
{"category":"category4","months":{"1":624,"2":667,"3":629,...}
{"category":"category5","months":{"1":32,"2":637,"3":299,...}
}]
我想基本上按月分组,求和并分配给一个总类别。因此,我会得到一个新对象,它看起来像下面这样,我会推送到我的数据对象:

{"category":"total","months":{"1":770,"2":2663,"3":1378,...}
我最终会:

data = [{"category":"category1","months":{"1":34,"2":67,"3":29,...}
{"category":"category2","months":{"1":34,"2":627,"3":292,...}
{"category":"category3","months":{"1":46,"2":665,"3":129,...}
{"category":"category4","months":{"1":624,"2":667,"3":629,...}
{"category":"category5","months":{"1":32,"2":637,"3":299,...}
{"category":"total","months":{"1":770,"2":2663,"3":1378,...}
}]

使用
Array.prototype.reduce
hash table
获取“total”对象,然后将其推回到数据中以获取所需的数据结构

请参见下面的演示:

var数据=[{“类别”:“类别1”,“月份”:{“1”:34,“2”:67,“3”:29},{“类别2”,“月份”:{“1”:34,“2”:627,“3”:292}},{“类别3”,“月份”:{“1”:46,“2”:665,“3”:129},{“类别”:“类别4”,“月份”:{“1”:624,“2”:667,“3”:629},{“类别5”,“月份”:“类别5”,“32”:637}
var result=data.reduce(函数(散列){
返回函数(p,c){
Object.key(c.months).forEach(函数(e){
如果(以p月为单位){
p、 月[e]+=c.月[e];
}否则{
p、 月[e]=+c.月[e];
}
});
返回p;
}
}(Object.create(null)),{类别:“总计”,月份:{});
控制台日志(结果);
//现在把这个推到数据上
数据推送(结果);
//控制台日志(数据)
.as控制台包装{top:0;最大高度:100%!重要;}
let data = [
{"category":"category1","months":{"1":34,"2":67,"3":29}},
{"category":"category2","months":{"1":34,"2":627,"3":292}},
{"category":"category3","months":{"1":46,"2":665,"3":129}},
{"category":"category4","months":{"1":624,"2":667,"3":629}},
{"category":"category5","months":{"1":32,"2":637,"3":299}},
];

let total = {"category":"total","months":{}};

data.forEach(category => {
      for(let prop in category.months){
          if (total.months[prop]){
            total.months[prop] += category.months[prop];
          }
          else{
            total.months[prop] = category.months[prop];
          }
      }
});

data.push(total);