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

如何按对象键对JavaScript对象数组分组并合并字段得到目标结构

实现方法

你可以通过临时映射表做分组聚合实现该需求,核心逻辑是按「账户名称+账户ID」作为唯一分组键,分别匹配借贷方金额,代码示例如下:

const data = [
  {
    "credit_account_id": "244",
    "debit_account_id": null,
    "sum": "30.00",
    "name": "Bank"
  },
  {
    "credit_account_id": null,
    "debit_account_id": "244",
    "sum": "110.00",
    "name": "Bank"
  }
];

// 用对象做分组映射,key为 name+accountId 的组合值,避免合并错误
const groupMap = {};

data.forEach(item => {
  // 获取当前条目的账户ID(两个ID总有一个非空)
  const accountId = item.credit_account_id || item.debit_account_id;
  // 格式化金额去掉小数位,可根据需求调整精度规则
  const amount = parseInt(item.sum);
  const groupKey = `${item.name}-${accountId}`;

  // 初始化分组条目
  if (!groupMap[groupKey]) {
    groupMap[groupKey] = {
      name: item.name,
      account: accountId,
      debit_account: 0,
      credit_account: 0
    };
  }

  // 根据ID类型匹配对应金额,如需同类型条目金额累加,直接用+=替换=即可
  if (item.credit_account_id) {
    groupMap[groupKey].debit_account = amount;
  } else {
    groupMap[groupKey].credit_account = amount;
  }
});

// 把映射表的值转成数组即为最终结果
const result = Object.values(groupMap);
console.log(result);

补充说明

如果同一个分组下存在多条同类型的记录,把赋值逻辑改成累加写法groupMap[groupKey].debit_account += amount即可实现金额累计,不会出现覆盖问题;金额格式也可以根据业务需求调整,比如要保留2位小数就用parseFloat(item.sum).toFixed(2)替换对应的格式化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:09:03