You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:45:09