You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并同key动态嵌套对象数组的aggregates属性并保留层级结构

动态嵌套层级数组对象合并实现方案

需求核心规则

给定结构完全一致的多层嵌套对象数组,合并规则如下:

  • 同一层级内,以field+value作为同组判定依据,相同组的对象合并为一个
  • 合并同组对象的aggregates属性,键名重复时为新增键添加序号后缀(第2个重复键加_1、第3个加_2依次类推)
  • 嵌套的Items子数组完全遵循相同合并规则,支持任意动态嵌套层级

实现思路

通过递归方法处理所有层级:

  1. 对当前层级的数组按field+value分组,同组对象统一合并
  2. 合并同组所有对象的aggregates属性,自动生成不重复的键名
  3. 收集同组所有对象的Items子项,递归调用合并函数处理子数组
  4. 组装合并后的对象,返回最终结果

代码实现(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 01:27:01