如何使用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的层级依次查找已有项:- 若当前层级没有匹配项,则创建对应结构的新项并加入上级数组。
- 最终找到
convenio对应的项后,将当前元素的subtotal累加到sum_subtotal中。
- 每次遍历结束返回累加器,逐步构建出目标的三层层级结构。
内容的提问来源于stack exchange,提问作者Luiz Alves
相关产品推荐
相关产品推荐

