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

JavaScript数组对象按vid合并amt求和,不同vid单独存入新数组

问题:合并数组中相同vid的对象并对amt求和

需求:处理包含address、vid、amt属性的对象数组,将相同vid的对象的amt值求和后合并为一个对象;不同vid的对象保留原样存入结果数组。

示例

输入数组

const array = [ 
    {address:'12312',vid:'1',amt:'0.1'},
    {address:'12312',vid:'1',amt:'0.1'},
    {address:'12312',vid:'2',amt:'0.1'},
];

期望输出

[{address:'12312',vid:'1',amt:'0.2'},{address:'12312',vid:'2',amt:'0.1'}]

你的代码问题分析

当前代码逻辑存在几个关键问题:

  • 数组vid存储的是{vid:..., total:...}对象,但判断!vid.includes(element.vid)时,是拿字符串vid和数组里的对象对比,永远不会匹配,导致所有元素都走if分支
  • totalAmt是全局变量,会把所有元素的amt累加在一起,无法实现按vid单独求和
  • 没有正确构建最终的result数组

解决方案

可以用Map来按vid分组,键为vid,值为对应的累加对象,高效实现分组求和:

const array = [ 
    {address:'12312',vid:'1',amt:'0.1'},
    {address:'12312',vid:'1',amt:'0.1'},
    {address:'12312',vid:'2',amt:'0.1'},
];

const resultMap = new Map();

array.forEach(item => {
    // 把amt转成数字方便计算
    const amtNum = Number(item.amt);
    // 检查当前vid是否已在Map中
    if (resultMap.has(item.vid)) {
        // 已存在则累加amt,最后转回字符串格式
        const existingItem = resultMap.get(item.vid);
        existingItem.amt = (Number(existingItem.amt) + amtNum).toString();
    } else {
        // 不存在则存入Map,浅拷贝原对象避免修改原数组
        resultMap.set(item.vid, {...item});
    }
});

// 把Map中的值转成数组就是最终结果
const result = Array.from(resultMap.values());
console.log(result);

代码说明

  • 用Map存储每个vid对应的合并对象,确保同一vid只会存一个对象
  • 遍历数组时,对每个元素判断是否已在Map中:存在则累加amt,不存在则新增
  • 最后通过Array.from(resultMap.values())把Map中的值转成数组,得到最终结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:48:20