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

如何使用JavaScript的reduce方法分组汇总对象数组为指定结构

使用JavaScript的reduce方法实现层级数据聚合

原数组

const arr=[
  { medico: "med1", rateio: "rat1", convenio: "conv1", subtotal: 10 },
  { medico: "med2", rateio: "rat2", convenio: "conv2", subtotal: 10 },
  { medico: "med2", rateio: "rat2", convenio: "conv2", subtotal: 20 },
  { medico: "med1", rateio: "rat1", convenio: "conv3", subtotal: 20 },
  { medico: "med1", rateio: "rat1", convenio: "conv3", subtotal: 25 },
  { medico: "med2", rateio: "rat3", convenio: "conv4", subtotal: 15 },
  { medico: 'med2', rateio: 'rat4', convenio: 'conv3', subtotal: 10 },
];

实现代码

const result = arr.reduce((acc, current) => {
  // 匹配或创建当前medico对应的层级项
  let medicoItem = acc.find(item => item.medico === current.medico);
  if (!medicoItem) {
    medicoItem = { medico: current.medico, grantotals: [] };
    acc.push(medicoItem);
  }

  // 匹配或创建当前rateio对应的层级项
  let rateioItem = medicoItem.grantotals.find(item => item.rateio === current.rateio);
  if (!rateioItem) {
    rateioItem = { rateio: current.rateio, grandtotals: [] };
    medicoItem.grantotals.push(rateioItem);
  }

  // 匹配或创建当前convenio对应的项并累加subtotal
  let convenioItem = rateioItem.grandtotals.find(item => item.convenio === current.convenio);
  if (!convenioItem) {
    convenioItem = { convenio: current.convenio, sum_subtotal: 0 };
    rateioItem.grandtotals.push(convenioItem);
  }
  convenioItem.sum_subtotal += current.subtotal;

  return acc;
}, []);

代码逻辑说明

  • 以空数组作为reduce的初始累加器,对应最终的结果数组。
  • 遍历原数组的每个元素时,按medico→rateio→convenio的层级依次查找已有项:
    1. 若当前层级没有匹配项,则创建对应结构的新项并加入上级数组。
    2. 最终找到convenio对应的项后,将当前元素的subtotal累加到sum_subtotal中。
  • 每次遍历结束返回累加器,逐步构建出目标的三层层级结构。

内容的提问来源于stack exchange,提问作者Luiz Alves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:02:02