如何将数组中数值相同的对象进行分组合并?
如何按value分组合并对象数组?
我有如下对象数组:
arrayOfObjects = [ { "name": "OneFullValue", "value": 709 }, { "name": "DRTG", "value": 0 }, { "name": "OtherFullValue", "value": 345 }, { "name": "TYU", "value": 0 }, { "name": "TRHY", "value": 0 }, { "name": "UOI", "value": 0 }, ]
想要得到的目标结果:
arrayOfObjectsEndGoal = [ { "name": "OneFullValue", "value": 709 }, { "name": "DRTG - TYU - TRHY - UOI", "value": 0 }, { "name": "OtherFullValue", "value": 345 } ]
核心需求:将所有value值相同的对象分组,合并后的对象name为对应所有对象的name以-连接的字符串,value保留原数值,不会因为分组数量改变。
比如当数组中value为123的对象有多个时,处理结果如下:
原始数组:
arrayOfObjects = [ { "name": "OneFullValue", "value": 709 }, { "name": "DRTG", "value": 123 }, { "name": "OtherFullValue", "value": 345 }, { "name": "TYU", "value": 123 }, { "name": "TRHY", "value": 123 }, { "name": "UOI", "value": 123 }, ]
目标结果:
arrayOfObjectsEndGoal = [ { "name": "OneFullValue", "value": 709 }, { "name": "DRTG - TYU - TRHY - UOI", "value": 123 }, { "name": "OtherFullValue", "value": 345 } ]
我已经尝试过两种方式:
- 用
reduce合并所有对象:
arrayOfObjects.reduce( ((prev, oth) => Object.assign(prev, oth)), {} )
- 用
forEach遍历操作,但逻辑没理清:
let objItem = {}; let arrayOfObjectsEndGoal = []; arrayOfObjects.foreach((obj) => { if (objItem[obj.value]) { let first = objItem[obj.name] -1; let newValue = { ...arrayOfObjectsEndGoal[first] }; arrayOfObjectsEndGoal[first] = newValue; });
但不知道怎么进一步实现目标效果,请问该如何完成这类对象的合并?
解决方案
可以借助reduce先按value分组,再将分组后的结构转换为目标数组:
const mergedArray = Object.values( arrayOfObjects.reduce((acc, curr) => { // 以value作为分组键 const key = curr.value; if (!acc[key]) { // 首次遇到该value时,初始化分组 acc[key] = { name: curr.name, value: curr.value }; } else { // 已有分组时,拼接name acc[key].name += ` - ${curr.name}`; } return acc; }, {}) );
代码解释:
reduce分组:遍历原数组,用每个对象的value作为键,将同value的对象归到同一分组中;- 初始化分组:如果当前
value对应的分组不存在,直接将当前对象作为分组的初始值; - 拼接name:如果分组已存在,就把当前对象的
name用-连接到分组对象的name上; - 转换为数组:用
Object.values()提取分组后的对象值,得到最终的合并数组。
这个方法能处理任意数字的value,完全符合需求,而且逻辑清晰、效率较高。
内容的提问来源于stack exchange,提问作者Beginner_Hello
相关产品推荐
相关产品推荐

