我有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}
]
}
]
答案 0 :(得分:1)
为了提高效率:
'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));