news 2026/6/10 16:56:28

JavaScript 根据数组对象的某个 指定属性 分组合并,并累加金额

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaScript 根据数组对象的某个 指定属性 分组合并,并累加金额
/** * 数组对象按指定属性分组,合并金额 * @param {Array} arr - 原始数组(元素为对象) * @param {string} groupKey - 分组依据的属性名(如 'type'、'id') * @param {string} moneyKey - 需合并的金额属性名(如 'money'、'amount') * @returns {Array} 合并后的数组 */functionmergeObjectsByKey(arr,groupKey,moneyKey){// 用 Map 分组(比普通对象更安全,支持任意类型键)constresultMap=newMap();arr.forEach(item=>{// 1. 获取当前 item 的分组键值(如 item.type = 'A')constkey=item[groupKey];// 2. 确保金额为数字(兼容字符串格式的金额,如 '100' → 100)constcurrentMoney=Number(item[moneyKey])||0;// 3. 检查 Map 中是否已存在该分组if(resultMap.has(key)){// 存在:累加金额constexistingItem=resultMap.get(key);existingItem[moneyKey]+=currentMoney;}else{// 不存在:创建新分组对象(深拷贝避免修改原数据)constnewItem={...item};// 复制原对象所有属性newItem[moneyKey]=currentMoney;// 初始化金额(确保为数字)resultMap.set(key,newItem);}});// 4. 将 Map 的值转为数组返回returnArray.from(resultMap.values());}

场景:按 type 分组,合并 money 金额

// 原始数组constoriginalArr=[{id:1,type:'水果',name:'苹果',money:10},{id:2,type:'蔬菜',name:'白菜',money:5},{id:3,type:'水果',name:'香蕉',money:15},// 同 type='水果'{id:4,type:'肉类',name:'猪肉',money:30},{id:5,type:'蔬菜',name:'萝卜',money:'8'},// 金额为字符串格式];// 调用函数:按 type 分组,合并 moneyconstmergedArr=mergeObjectsByKey(originalArr,'type','money');console.log(mergedArr);

输出结果(按 type 分组,金额累加):

[{id:1,type:'水果',name:'苹果',money:25},// 10 + 15 = 25{id:2,type:'蔬菜',name:'白菜',money:13},// 5 + 8 = 13(字符串自动转数字){id:4,type:'肉类',name:'猪肉',money:30}]

关键说明
分组逻辑:用 Map 存储分组,键为 groupKey 的值(如 ‘水果’),值为合并后的对象。Map 比普通对象更安全(避免键名冲突,支持数字 / 对象等类型的键)。
金额兼容:通过 Number(item[moneyKey]) || 0 处理:
数字金额(如 10)直接使用;
字符串金额(如 ‘8’)自动转为数字;
缺失金额或非数字(如 undefined、‘abc’)视为 0。
属性保留:用 { …item } 浅拷贝原对象的所有属性(如 id、name),合并时仅更新金额,其他属性保留第一个分组对象的值(若需保留所有属性,可修改为数组存储,如 name: [‘苹果’, ‘香蕉’])。
扩展需求:保留分组内所有非金额属性
如果需要保留同组所有对象的非金额属性(如合并 name 为数组),可修改函数:

functionmergeObjectsWithAllProps(arr,groupKey,moneyKey){constresultMap=newMap();arr.forEach(item=>{constkey=item[groupKey];constcurrentMoney=Number(item[moneyKey])||0;if(resultMap.has(key)){constexisting=resultMap.get(key);existing[moneyKey]+=currentMoney;// 非金额属性转为数组(去重)Object.keys(item).forEach(prop=>{if(prop!==groupKey&&prop!==moneyKey){if(!existing[prop].includes(item[prop])){existing[prop].push(item[prop]);}}});}else{constnewItem={[moneyKey]:currentMoney};// 分组键保留原值,其他属性转为数组Object.keys(item).forEach(prop=>{newItem[prop]=prop===groupKey?item[prop]:[item[prop]];});resultMap.set(key,newItem);}});returnArray.from(resultMap.values());}

扩展示例输出:

[{type:'水果',id:[1,3],name:['苹果','香蕉'],money:25},// ... 其他分组]``` 边界情况处理 原始数组为空:返回空数组; 部分对象缺失 groupKey:按undefined分组; 金额为0或负数:正常累加(符合业务逻辑); 分组键为复杂类型(如对象):Map 可直接支持(普通对象会转为字符串[object Object],不推荐用对象作为分组键)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 5:27:41

适配晶晨 S905X3/S912 等!纯净版刷机包 + MD5 校验

针对晶晨主流芯片(S905X3/S912/S922X/S905L4 等)单独优化,每个刷机包都内置芯片型号校验机制,刷前自动匹配硬件,避免错刷导致的设备黑屏、无法启动问题。实测在老款晶晨 S905X 机顶盒上刷入后,启动速度比原…

作者头像 李华
网站建设 2026/6/10 10:08:10

【收藏备用】AI大模型从入门到实战:0基础也能学会的系统学习指南

AI大模型火遍全网,你是否也想入门却被“算法复杂”“数学门槛高”吓退?看着别人用LLM做项目、提效率,自己却连“Prompt怎么写”都摸不清方向?这篇专为0基础学习者打造的收藏级指南,从认知破冰到代码实操全拆解&#xf…

作者头像 李华
网站建设 2026/6/9 19:20:09

AutoGPT能否应用于政府政务流程自动化?

AutoGPT能否应用于政府政务流程自动化? 在政务服务大厅里,一位工作人员正为“如何起草一份符合最新政策的社区养老实施方案”犯愁。他需要查阅国家规划文件、比对地方统计数据、参考外省市案例,还要确保格式规范、措辞严谨——这一系列工作往…

作者头像 李华
网站建设 2026/6/3 18:16:18

【CMake 】[第九篇] 解决 CMake + Visual Studio 中文乱码问题完整指南

解决 CMake Visual Studio 中文乱码问题完整指南 前言 在使用 CMake 生成 Visual Studio 工程后,很多开发者会遇到一个常见问题:程序运行时,控制台输出的中文字符显示为乱码。这个问题看似简单,但实际上涉及到文件编码、编译器…

作者头像 李华
网站建设 2026/6/10 8:13:00

29、树莓派媒体中心搭建与使用全指南

树莓派媒体中心搭建与使用全指南 在当今数字化时代,树莓派作为一款功能强大且价格亲民的单板计算机,被广泛应用于各种项目中。本文将详细介绍如何在树莓派上搭建和使用媒体中心,包括XBMC的编译安装、常见问题解决以及利用AirPlay协议实现音乐流播放等内容。 下载与克隆XBM…

作者头像 李华
网站建设 2026/6/10 15:18:22

蚂蚁旗下AI健康助手AQ更名为“蚂蚁阿福”,App月活超1500万

12月15日消息,蚂蚁集团宣布旗下AI健康应用AQ品牌升级为“蚂蚁阿福”,并发布App新版本,升级健康陪伴、健康问答、健康服务三大功能。 升级后的“蚂蚁阿福”聚焦“健康”战略,定位从AI工具转向AI健康朋友,能够像真人朋友…

作者头像 李华