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

如何在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));

代码解释

  1. 初始化根节点:用空数组root存储最顶层的目录/文件节点。
  2. 遍历每条路径:对每条路径进行单独处理。
  3. 逐层匹配节点:
    • 从根层级开始,检查当前层级是否存在对应名称的节点。
    • 若不存在,创建新的节点对象(包含name和空children数组)并加入当前层级。
    • 将当前处理层级切换为该节点的children数组,继续处理路径的下一个名称。
  4. 返回结果:所有路径处理完成后,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:31:03