如何使用两个数组在条件条件下汇总数据?

时间:2018-11-23 17:06:38

标签: javascript

我有M和W数据集,结构如下:

M = [
 'ModuleName': 'GDD',
 {Fields: [
    {'FieldID': 5, 'Date': '2018-12-01'},
    {'FieldID': 6, 'Date': '2018-12-01'}
   ]
 }
]

W = [
      {'FieldID': 5, 'Value': 10, 'WDate': 2018-06-05'},
      {'FieldID': 5, 'Value': 10, 'WDate': 2018-06-05'},
      {'FieldID': 6, 'Value': 50, 'WDate': 2018-07-05'},
      {'FieldID': 6, 'Value': 20, 'WDate': 2018-09-05'}
    ]

我想从W数据集中计算所有字段的值,并根据FieldID进行分组,并从M数据集中得出日期条件。

M.forEach(m => {
  if (m.ModuleName === 'GDD') {
    m.Fields.forEach(f => {
      const sum = W.map(w => w.Value).reduce((acc, value) => acc + value, 0);
    });
  }
});

条件:如果来自M.Fields的日期等于或大于来自W.wDate的日期。

由于数据量巨大,因此我还需要考虑效率。

预期的输出是添加另一个属性并将Value的总和存储在m.Fields字段对象中。

M = [
 'ModuleName': 'GDD',
 {Fields: [
    {'FieldID': 5, 'Date': '2018-10-01', 'sum': 20},
    {'FieldID': 6, 'Date': '2018-10-01', 'sum': 70}
   ]
 }
]

1 个答案:

答案 0 :(得分:1)

为了提高效率:

  1. 转换为对象以加快访问速度
  2. 用于循环,而不用于forEach

'use strict';

const M = {
    'ModuleName': 'GDD',
    Fields: [
       {'FieldID': 5, 'Date': '2018-05-01'},
       {'FieldID': 6, 'Date': '2018-05-01'}
      ]
    
};
   
const W = [
         {'FieldID': 5, 'Value': 10, 'WDate': '2018-06-05'},
         {'FieldID': 5, 'Value': 10, 'WDate': '2018-06-05'},
         {'FieldID': 6, 'Value': 50, 'WDate': '2018-07-05'},
         {'FieldID': 6, 'Value': 20, 'WDate': '2018-09-05'}
    ];


let d, e, f = {};
// build object for quicker findability
for (e of M.Fields) {
    f[e.FieldID] = e;
    e.sum = 0;
}

for (e of W) {
    if (d = f[e.FieldID]) {
        if (e.WDate >= d.Date) {
            d.sum += e.Value;
        }
    } else {
        console.log(`could not find FieldID ${e.FieldID}`)
    }
}

console.log(JSON.stringify(M, null, 4));