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
相关产品推荐
相关产品推荐

