如何用JavaScript归并对象数组并返回去重的供应商汇总数组
解决方案
方法一:用Array.reduce一步完成分组与金额累加
这是最高效的实现方式,仅需遍历一次原数组,同时完成供应商分组和符合条件的金额计算:
const result = invoices.reduce((acc, invoice) => { // 跳过状态不等于3的发票 if (invoice.status !== 3) return acc; const supplierItem = acc.find(item => item.supplierId === invoice.supplierId); if (supplierItem) { // 供应商已存在,累加对应金额 supplierItem.invoicesTotal += invoice.invoiceTotal; } else { // 供应商不存在,新增统计条目 acc.push({ supplierId: invoice.supplierId, supplierName: invoice.supplierName, invoicesTotal: invoice.invoiceTotal }); } return acc; }, []); console.log(result);
方法二:基于你现有代码修改
如果想沿用自己的Map去重逻辑,可在生成最终数组时,通过过滤原数组计算对应供应商的总金额:
const distinctSupplierMap = new Map( invoices.map((invoice) => [invoice.supplierId, invoice]) ); const distinctSuppliersFilter = [...distinctSupplierMap.values()]; const arr = distinctSuppliersFilter.map((distSupp) => { // 筛选当前供应商下状态为3的发票,计算总金额 const total = invoices .filter(inv => inv.supplierId === distSupp.supplierId && inv.status === 3) .reduce((sum, inv) => sum + inv.invoiceTotal, 0); return { supplierId: distSupp.supplierId, supplierName: distSupp.supplierName, invoicesTotal: total }; }); console.log(arr);
补充说明
- 方法一性能更优,仅遍历原数组一次,适合数据量较大的场景;
- 方法二逻辑更贴合你已有的代码思路,但需要额外遍历原数组计算金额,性能略低。
内容的提问来源于stack exchange,提问作者Rich
相关产品推荐
相关产品推荐

