按元素分组和汇总数据数组

时间:2019-07-02 12:22:30

标签: javascript arrays

无论三个类别(DEA,ISA,SIPP)指定的帐户类型如何,我都需要按月创建一个新的付款分组数组

我的数据的格式为

var arr = [
        { 'DEA','1', 'Jan',1266 },
        { 'ISA','1', 'Jan',621 },
        { 'SIPP','1', 'Jan',552 },
        { 'DEA','2', 'Feb',889 },
        { 'ISA','2', 'Feb',921 },
        { 'SIPP','2', 'Feb',901 },
      ];

月份1或2等是冗余数据,即。我的输出中不需要

我需要按以下格式按月将付款分组到新的数组中:

var newarr =
[
{ 'Jan',2439 },
{ 'Feb',2711 },
];

我已使用以下代码作为起点,该代码按年龄类别分组并汇总了TOTAL,但是我仍无法成功将其应用于数据

var arr = [
            { AGENDADOR: 'AGE270', TOTAL : 6},
            { AGENDADOR: 'AGE270', TOTAL : 3},
            { AGENDADOR: 'AGE203', TOTAL : 5},
            { AGENDADOR: 'AGE028', TOTAL : 9},
        ];
      
var totals = arr.reduce(function (r, o) {
  (r[o.AGENDADOR])? r[o.AGENDADOR] += o.TOTAL : r[o.AGENDADOR] = o.TOTAL;
  return r;
}, {});

console.log(totals);

非常感谢您帮助我入门,

非常感谢

科林

1 个答案:

答案 0 :(得分:1)

为了汇总月份,另一种方法是维护一个月份数组,用于循环并提取您需要求和的值。

基本上,函数reduce按月对值进行分组,而函数Object.values将分组后的值提取为数组。

这种方法将提取对象中显示的所有月份。

let months = ['Jan', 'Feb', 'Mar'];// and so on.
let arr = [        { 'DEA':'1', 'Jan':1266 },        { 'ISA':'1', 'Jan':621 },        { 'SIPP':'1', 'Jan':552 },        { 'DEA':'2', 'Feb':889 },        { 'ISA':'2', 'Feb':921 },        { 'SIPP':'2', 'Feb':901 }      ];
      
let result = Object.values(arr.reduce((a, c) => {
  months.forEach(m => {
    if (m in c) (a[m] || (a[m] = {[m]: 0}))[m] += c[m];
  });
  return a;
}, Object.create(null)));

console.log(result);
.as-console-wrapper { min-height: 100%; }