如何按riskTypeNo属性分组,并通过javascript中的selectedValue计算总和和平均值?<



我通过为sum和count运行单独的reduce函数,然后使用Object.entries创建finalobj来实现结果。这可以用更少更好的代码实现吗?

{A1: {Avg: 4, Count: 1, Sum: 4}, A13: {Avg: 3, Count: 1, Sum: 3}, A4: {Avg: 1, Count: 1, Sum: 1}, C6: {Avg: 1, Count: 1, Sum: 1}, M1: {Avg: 1.75, Count: 4, Sum: 7}

我代码:

const riskTypeNoWithSelectedValue = [
{
"riskTypeNo": "A1",
"selectedValue": 4
},
{
"riskTypeNo": "M1",
"selectedValue": 4
},
{
"riskTypeNo": "C6",
"selectedValue": 1
},
{
"riskTypeNo": "M1",
"selectedValue": 1
},
{
"riskTypeNo": "M1",
"selectedValue": 1
},
{
"riskTypeNo": "A4",
"selectedValue": 1
},
{
"riskTypeNo": "M1",
"selectedValue": 1
},
{
"riskTypeNo": "A13",
"selectedValue": 3
}
];
const sumrRiskTypeNo = riskTypeNoWithSelectedValue.reduce((accumulator, {riskTypeNo,  selectedValue}) => (accumulator[riskTypeNo] = (accumulator[riskTypeNo] || 0) + selectedValue, accumulator), {});

const countRiskTypeNo = riskTypeNoWithSelectedValue.reduce((accumulator, {riskTypeNo,  selectedValue}) => (accumulator[riskTypeNo] = (accumulator[riskTypeNo] || 0) + 1, accumulator), {});

const finalObj = {};
Object.entries(sumrRiskTypeNo).forEach(([k, v]) => {
finalObj[k] = {"Sum": v, "Count": countRiskTypeNo[k], "Avg": v/countRiskTypeNo[k]}; 
});
console.log(finalObj);

Lodash是这类操作的一个很好的库。

const data = _.chain(riskTypeNoWithSelectedValue)
.groupBy(x => x.riskTypeNo)
.mapValues(list => ({
"Count": list.length,
"Sum": _.sum(list),
"Avg": _.mean(list),
}))
.value();

https://codesandbox.io/s/lodash-playground-forked-00n249?file=/src/index.js: 515 - 714

最新更新