如何合并同key动态嵌套对象数组的aggregates属性并保留层级结构
动态嵌套层级数组对象合并实现方案
需求核心规则
给定结构完全一致的多层嵌套对象数组,合并规则如下:
- 同一层级内,以
field+value作为同组判定依据,相同组的对象合并为一个 - 合并同组对象的
aggregates属性,键名重复时为新增键添加序号后缀(第2个重复键加_1、第3个加_2依次类推) - 嵌套的
Items子数组完全遵循相同合并规则,支持任意动态嵌套层级
实现思路
通过递归方法处理所有层级:
- 对当前层级的数组按
field+value分组,同组对象统一合并 - 合并同组所有对象的
aggregates属性,自动生成不重复的键名 - 收集同组所有对象的
Items子项,递归调用合并函数处理子数组 - 组装合并后的对象,返回最终结果
代码实现(JavaScript示例)
// 合并两个aggregates对象,重复键自动加序号后缀 function mergeAggregates(target, source) { Object.entries(source).forEach(([originKey, value]) => { let finalKey = originKey; let suffixIndex = 1; // 生成不重复的键名 while (Object.prototype.hasOwnProperty.call(target, finalKey)) { finalKey = `${originKey}_${suffixIndex}`; suffixIndex++; } target[finalKey] = value; }); } // 核心递归合并函数,输入待合并数组,返回合并后数组 function mergeNestedData(arr) { // 按field+value分组 const groupMap = {}; arr.forEach(item => { const groupKey = `${item.field}_${item.value}`; if (!groupMap[groupKey]) groupMap[groupKey] = []; groupMap[groupKey].push(item); }); const mergedResult = []; // 逐组合并 Object.values(groupMap).forEach(groupItems => { // 初始化合并后的对象基础属性 const mergedItem = { field: groupItems[0].field, value: groupItems[0].value, aggregates: {}, Items: [] }; // 合并当前组所有aggregates,收集所有子Items groupItems.forEach(item => { mergeAggregates(mergedItem.aggregates, item.aggregates || {}); mergedItem.Items.push(...(item.Items || [])); }); // 递归合并子层级Items mergedItem.Items = mergeNestedData(mergedItem.Items); mergedResult.push(mergedItem); }); return mergedResult; } // 调用示例,直接传入你的Data数组即可 // const finalData = mergeNestedData(Data);
特性说明
- 完全兼容任意嵌套层级,不需要提前指定嵌套深度
- 不会修改原始数组,返回全新的合并后对象,无副作用
- 重复键序号从1开始自增,支持多个重复键的合并场景
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

