如何用ES6/ES10实现对象数组多参数分组及多字段聚合统计
多字段分组统计订单需求
我有如下订单数组,需要同时按carrierCode和depo两个参数分组,还要累加统计每组的boxes总数量、CODAmount总金额:
const orders = [ { "depo": "Berlin", "boxes": 1, "isCOD": true, "CODAmount": 45.33, "carrierCode": "ups", "sid": "DCAC298A627DF2D1980D23F67F05E8E4", }, { "depo": "Leipzig", "boxes": 2, "isCOD": false, "CODAmount": 0, "carrierCode": "tnt", "sid": "8BF93B9159742250CA7F73304808E316", }, { "depo": "Leipzig", "boxes": 2, "isCOD": true, "CODAmount": 124.00, "carrierCode": "dhl", "sid": "0DC1A9BCFA6C5834361AFABBD857CEDD", }, { "depo": "Leipzig", "boxes": 3, "isCOD": true, "CODAmount": 415.33, "carrierCode": "tnt", "sid": "8BF93B9159742250CA7F73304808E316", }, { "depo": "Berlin", "boxes": 1, "isCOD": false, "CODAmount": 0, "carrierCode": "tnt", "sid": "0DC1A9BCFA6C5834361AFABBD857CEDD", } ];
原有单字段分组实现
之前已经实现了仅按carrierCode分组统计订单数量的逻辑:
var groups = orders.reduce((p, c) => { var code = c.carrierCode; if (!p.hasOwnProperty(code)) { p[code] = 0; } p[code]++; return p; }, {}); console.log(groups); var countsExtended = Object.keys(groups).map(k => { return {code: k, orderscount: groups[k]}; }); console.log(countsExtended);
原有输出结果:
{ ups: 1, tnt: 3, dhl: 1 }
[ { code: 'ups', orderscount: 1 }, { code: 'tnt', orderscount: 3 }, { code: 'dhl', orderscount: 1 } ]
目标输出格式
需要得到如下结构的统计结果:
[ { code: 'ups', orderscount: 1, depo:'Berlin', boxes: 1, CODAmount: 45.33}, { code: 'tnt', orderscount: 1, depo:'Berlin', boxes: 1, CODAmount: 0.00}, { code: 'tnt', orderscount: 2, depo:'Leipzig', boxes: 5, CODAmount: 415.33}, { code: 'dhl', orderscount: 1, depo:'Leipzig', boxes: 2, CODAmount: 124.00} ]
实现方案(ES6+语法)
思路:将carrierCode和depo拼接为唯一的分组key,在reduce阶段同时累计订单数、箱子总数、COD总金额,最后通过Object.values直接转为目标数组格式:
const result = Object.values(orders.reduce((acc, cur) => { // 拼接双字段唯一分组key const key = `${cur.carrierCode}|${cur.depo}`; // 分组不存在则初始化 if (!acc[key]) { acc[key] = { code: cur.carrierCode, depo: cur.depo, orderscount: 0, boxes: 0, CODAmount: 0 }; } // 累加统计值 acc[key].orderscount += 1; acc[key].boxes += cur.boxes; acc[key].CODAmount = Number((acc[key].CODAmount + cur.CODAmount).toFixed(2)); return acc; }, {})); console.log(result);
运行上述代码即可直接得到符合要求的输出结果。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

