非覆盖式递归复制:表格数据转多维对象数组实现问询
实现表格数据到多维嵌套对象数组的转换
需求说明
我们需要将如下的表格数据:
| groups_field | value |
|---|---|
| 1-1 | 2 |
| 1-2-1 | 4 |
| 2-1 | 3 |
| 2-2-4 | 8 |
转换为结构如下的多维对象数组:
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));
代码关键点说明
- 层级构建逻辑:通过
reduceRight从内到外生成嵌套结构,最内层是单个field,倒数第二层是带fields数组的组,更外层是带groups数组的父组。 - 非覆盖合并:
mergeNestedStructure函数负责处理合并逻辑,先检查当前层级是否有相同id的节点,没有则直接添加,有则根据节点类型(字段/子组)进行追加或递归合并,彻底避免覆盖已有数据。 - 类型统一:把拆分后的字符串id转为数字类型,和目标结构的类型保持一致。
运行这段代码后,就能得到你想要的多维对象数组结构啦。
内容的提问来源于stack exchange,提问作者Blalan
相关产品推荐
相关产品推荐

