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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:46:32