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

非覆盖式递归复制:表格数据转多维对象数组实现问询

实现表格数据到多维嵌套对象数组的转换

需求说明

我们需要将如下的表格数据:

groups_fieldvalue
1-12
1-2-14
2-13
2-2-48

转换为结构如下的多维对象数组:

groups: [{ 
 id: 1, 
 fields: [{ id: 1, value: 2 }], 
 groups: [{ id: 2, fields: [{ id: 1, value: 4 }] }] 
}, { 
 id: 2, 
 fields: [{ id: 1, value: 3 }], 
 groups: [{ id: 2, fields: [{ id: 4, value: 8 }] }] 
}]

现有思路与完善方案

你已经尝试用reduceRight来处理层级拆分后的数组,这个思路非常合适——核心是从最内层往外层构建嵌套结构,关键要解决非覆盖式合并的问题:也就是同一个父节点下的已有子组/字段不能被新数据替换,而是要追加进去。

完整实现代码

// 模拟表格原始数据
const tableData = [
  { groups_field: '1-1', value: 2 },
  { groups_field: '1-2-1', value: 4 },
  { groups_field: '2-1', value: 3 },
  { groups_field: '2-2-4', value: 8 },
];

function transformTableToGroups(data) {
  const groups = [];

  data.forEach(row => {
    // 把层级字符串拆分成数字类型的id数组
    const gfArray = row.groups_field.split('-').map(Number);
    // 从最内层开始反向构建嵌套结构
    const nestedStructure = gfArray.reduceRight((acc, key, index) => {
      if (index === gfArray.length - 1) {
        // 最内层是单个field对象
        return { id: key, value: row.value };
      } else if (index === gfArray.length - 2) {
        // 倒数第二层是包含fields数组的组
        return {
          id: key,
          fields: [acc]
        };
      } else {
        // 更外层的组,包含groups数组
        return {
          id: key,
          groups: [acc]
        };
      }
    }, null);

    // 将构建好的结构合并到总groups数组(避免覆盖已有数据)
    mergeNestedStructure(groups, nestedStructure);
  });

  return { groups };
}

// 核心工具函数:非覆盖式合并嵌套结构
function mergeNestedStructure(targetArray, source) {
  // 先查找当前层级是否存在相同id的节点
  const existingNode = targetArray.find(item => item.id === source.id);
  
  if (!existingNode) {
    // 没有相同id节点,直接添加
    targetArray.push(source);
    return;
  }

  // 存在相同id节点,根据节点类型进行合并
  if (source.fields) {
    // 合并fields:把新字段追加到已有字段数组
    existingNode.fields = existingNode.fields || [];
    existingNode.fields.push(...source.fields);
  } else if (source.groups) {
    // 递归合并子groups
    existingNode.groups = existingNode.groups || [];
    mergeNestedStructure(existingNode.groups, source.groups[0]);
  }
}

// 测试转换效果
const result = transformTableToGroups(tableData);
console.log(JSON.stringify(result, null, 2));

代码关键点说明

  1. 层级构建逻辑:通过reduceRight从内到外生成嵌套结构,最内层是单个field,倒数第二层是带fields数组的组,更外层是带groups数组的父组。
  2. 非覆盖合并:mergeNestedStructure函数负责处理合并逻辑,先检查当前层级是否有相同id的节点,没有则直接添加,有则根据节点类型(字段/子组)进行追加或递归合并,彻底避免覆盖已有数据。
  3. 类型统一:把拆分后的字符串id转为数字类型,和目标结构的类型保持一致。

运行这段代码后,就能得到你想要的多维对象数组结构啦。

内容的提问来源于stack exchange,提问作者Blalan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:11:16