如何按对象键对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
相关产品推荐
相关产品推荐

