JavaScript 基于DEPENDENCY字段实现任意深度的对象数组嵌套
问题描述
现有一份扁平结构的对象数组,需要将其转换为嵌套层级结构,对象的嵌套深度由DEPENDENCY属性定义,拆分该属性值即可得到对应的嵌套层级。
原始输入数据
const initArray = [ { NAME: "initArray", DEPENDENCY: "0", VAR1: "VAR1", VAR2: "VAR2" }, { NAME: "initArray2", DEPENDENCY: "0.0", VAR1: "VAR1", VAR2: "VAR2" }, { NAME: "initArray3", DEPENDENCY: "0.1", VAR1: "VAR1", VAR2: "VAR2" }, { NAME: "initArray4", DEPENDENCY: "0.0.0", VAR1: "VAR1", VAR2: "VAR2" }, { NAME: "initArray5", DEPENDENCY: "0.0.1", VAR1: "VAR1", VAR2: "VAR2" }, { NAME: "initArray6", DEPENDENCY: "0.0.2", VAR1: "VAR1", VAR2: "VAR2" }, { NAME: "initArray7", DEPENDENCY: "0.1.1", VAR1: "VAR1", VAR2: "VAR2" }, { NAME: "initArray8", DEPENDENCY: "0.1.2", VAR1: "VAR1", VAR2: "VAR2" }, { NAME: "initArray9", DEPENDENCY: "0.1.3", VAR1: "VAR1", VAR2: "VAR2" }, { NAME: "initArray10", DEPENDENCY: "0.1.4", VAR1: "VAR1", VAR2: "VAR2" }, { NAME: "initArray11", DEPENDENCY: "0.1.5", VAR1: "VAR1", VAR2: "VAR2" }, ];
期望输出结果
const myArray = [ { NAME: "initArray", DEPENDENCY: "0", VAR1: "VAR1", VAR2: "VAR2", CHILDREN: [ { NAME: "initArray2", DEPENDENCY: "0.0", VAR1: "VAR1", VAR2: "VAR2", CHILDREN: [ { NAME: "initArray4", DEPENDENCY: "0.0.0", VAR1: "VAR1", VAR2: "VAR2", }, { NAME: "initArray5", DEPENDENCY: "0.0.1", VAR1: "VAR1", VAR2: "VAR2", }, { NAME: "initArray6", DEPENDENCY: "0.0.2", VAR1: "VAR1", VAR2: "VAR2", }, ], }, { NAME: "initArray3", DEPENDENCY: "0.1", VAR1: "VAR1", VAR2: "VAR2", CHILDREN: [ { NAME: "initArray7", DEPENDENCY: "0.1.1", VAR1: "VAR1", VAR2: "VAR2", }, { NAME: "initArray8", DEPENDENCY: "0.1.2", VAR1: "VAR1", VAR2: "VAR2", }, { NAME: "initArray9", DEPENDENCY: "0.1.3", VAR1: "VAR1", VAR2: "VAR2", }, { NAME: "initArray10", DEPENDENCY: "0.1.4", VAR1: "VAR1", VAR2: "VAR2", }, { NAME: "initArray11", DEPENDENCY: "0.1.5", VAR1: "VAR1", VAR2: "VAR2", }, ], }, ], }, ];
现有实现的局限性
当前已实现的固定层级转换代码仅支持最多3层嵌套,每增加一层都需要手动新增对应的if判断逻辑,无法适配任意深度的嵌套需求。
通用解决方案
实现思路
通过层级指针遍历的方式,沿着DEPENDENCY拆分后的索引路径逐步定位到当前节点的父级容器,自动创建不存在的CHILDREN数组,无需手动判断层级深度,可支持任意层嵌套。
实现代码
function buildNestedTree(flatArray) { const result = []; // 遍历所有扁平节点 flatArray.forEach(item => { const dependencyLevels = item.DEPENDENCY.split('.').map(Number); // 初始指针指向根数组 let currentLevel = result; // 遍历除最后一层外的所有层级,定位到父节点的CHILDREN数组 for (let i = 0; i < dependencyLevels.length - 1; i++) { const index = dependencyLevels[i]; // 若节点没有CHILDREN数组则初始化 if (!currentLevel[index].CHILDREN) currentLevel[index].CHILDREN = []; // 指针移动到下一层级的CHILDREN数组 currentLevel = currentLevel[index].CHILDREN; } // 最后一层索引对应的位置插入当前节点 const lastIndex = dependencyLevels.at(-1); currentLevel[lastIndex] = item; }); return result; } // 调用示例 const myArray = buildNestedTree(initArray);
代码说明
- 完全适配给出的输入输出格式,无需修改原数据结构即可直接使用
- 支持任意深度的
DEPENDENCY层级,例如0.1.2.3.4.5这类6层结构也可以自动完成嵌套 - 时间复杂度为O(n * k),其中n是扁平数组长度,k是平均嵌套深度,性能稳定
内容的提问来源于stack exchange,提问作者iNemesis
相关产品推荐
相关产品推荐

