如何遍历对象数组,按title合并并求和对应属性?
解决方案:分组累加同title的对象属性
嘿,这个需求太常见啦!用一个映射对象来做分组累加就完全能解决,不管同title的对象有5个、10个还是15个都不在话下,而且全程用属性名访问,完美符合你的要求。
核心思路
- 先创建一个临时的映射对象(比如
sumMap),用每个对象的title作为键,存储对应属性的累加结果。 - 遍历原始数组里的每一个对象:
- 如果当前
title还没在映射里,就把这个对象的属性值初始化进去; - 如果已经存在,就把对应属性的值逐个累加。
- 如果当前
- 最后把映射对象转成你需要的输出格式(数组或者字符串都可以)。
代码示例(JavaScript)
首先注意下你的示例数组里的语法小问题:对象键值对应该用:而不是=,我先修正了这个,然后上代码:
// 你的原始数组(修正语法后) const data = [ { "title": "Test", "prop1": 4, "prop2": 6 }, { "title": "Test2", "prop1": 5, "prop2": 7 }, { "title": "Test", "prop1": 6, "prop2": 14 } ]; // 初始化映射对象,用来存每个title的累加结果 const sumMap = {}; // 遍历数组,处理每个对象 data.forEach(item => { // 用属性名访问title,符合你的要求 const currentTitle = item['title']; // 如果这个title还没被记录,初始化 if (!sumMap[currentTitle]) { sumMap[currentTitle] = { title: currentTitle, prop1: item['prop1'], prop2: item['prop2'] }; } else { // 已经存在,累加对应属性 sumMap[currentTitle]['prop1'] += item['prop1']; sumMap[currentTitle]['prop2'] += item['prop2']; } }); // 转成你要的数组格式 const resultArray = Object.values(sumMap); console.log(resultArray); // 输出: [ { title: 'Test', prop1: 10, prop2: 20 }, { title: 'Test2', prop1: 5, prop2: 7 } ] // 转成你需要的字符串格式 const resultString = resultArray.map(item => `${item.title}, ${item.prop1}, ${item.prop2}`).join(';'); console.log(resultString); // 输出: "Test, 10, 20;Test2, 5, 7"
进阶:通用版(支持任意属性)
如果以后你的对象会新增更多属性(比如prop3、prop4),可以用下面的通用写法,不用每次改代码:
data.forEach(item => { const currentTitle = item['title']; if (!sumMap[currentTitle]) { // 浅拷贝当前对象,保留所有属性 sumMap[currentTitle] = {...item}; } else { // 遍历所有属性,只累加数字类型的属性(排除title) Object.keys(item).forEach(key => { if (key !== 'title' && typeof item[key] === 'number') { sumMap[currentTitle][key] += item[key]; } }); } });
这个版本会自动处理所有数字类型的属性,不管你加多少个都能正确累加。
内容的提问来源于stack exchange,提问作者yaksey
相关产品推荐
相关产品推荐

