如何在JavaScript中将数组的数组转换为嵌套对象数组?
将路径数组转换为嵌套文件树对象数组
需求说明
给定一组表示文件路径的子数组(如 [['A', 'B', 'C'], ['A', 'B', 'D'], ['L', 'M', 'N']]),需要将其转换为嵌套对象数组,每个对象包含name(当前节点名称)和children(子节点数组)两个属性,最终形成类似文件目录树的结构。
实现方案
通过迭代遍历每条路径,逐层检查并创建节点,最终构建出完整的嵌套树结构。核心思路是维护当前处理的层级,逐个匹配路径中的名称,不存在则创建新节点,然后进入子层级继续处理。
function buildTree(paths) { const root = []; paths.forEach(path => { let currentLevel = root; path.forEach(name => { // 在当前层级查找同名节点 let node = currentLevel.find(item => item.name === name); if (!node) { // 不存在则创建新节点 node = { name, children: [] }; currentLevel.push(node); } // 切换到子层级继续处理 currentLevel = node.children; }); }); return root; } // 测试示例 const inputPaths = [['A', 'B', 'C'], ['A', 'B', 'D'], ['L', 'M', 'N']]; const tree = buildTree(inputPaths); console.log(JSON.stringify(tree, null, 2));
代码解释
- 初始化根节点:用空数组
root存储最顶层的目录/文件节点。 - 遍历每条路径:对每条路径进行单独处理。
- 逐层匹配节点:
- 从根层级开始,检查当前层级是否存在对应名称的节点。
- 若不存在,创建新的节点对象(包含
name和空children数组)并加入当前层级。 - 将当前处理层级切换为该节点的
children数组,继续处理路径的下一个名称。
- 返回结果:所有路径处理完成后,
root数组就是最终的嵌套树结构。
扩展:节点排序
如果需要每个层级的子节点按名称排序,可以在创建节点后对当前层级的children进行排序:
function buildTreeWithSort(paths) { const root = []; paths.forEach(path => { let currentLevel = root; path.forEach(name => { let node = currentLevel.find(item => item.name === name); if (!node) { node = { name, children: [] }; currentLevel.push(node); // 按名称排序当前层级的子节点 currentLevel.sort((a, b) => a.name.localeCompare(b.name)); } currentLevel = node.children; }); }); return root; }
内容的提问来源于stack exchange,提问作者simon777
相关产品推荐
相关产品推荐

