You need to enable JavaScript to run this app. 如何将指定层级的文件与文件夹列表转换为嵌套结构JSON对象
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定层级的文件与文件夹列表转换为嵌套结构JSON对象

扁平路径列表转嵌套目录结构 实现方案

该转换场景完全可行,核心逻辑是逐路径遍历、按层级匹配已有节点、不存在则新建对应节点,最终生成符合规则的嵌套目录树。

核心处理流程

  • 初始化空数组作为根层级容器,承载最外层的文件与文件夹节点
  • 对每个输入路径做规范化预处理:将连续的路径分隔符替换为单个分隔符,过滤掉拆分后产生的空路径段,解决photos/2007//sample3.jpg这类带连续斜杠的异常路径问题
  • 按路径层级逐段遍历:
    • 拆分后的路径数组中,最后一段判定为文件名,其余段判定为文件夹名
    • 从根层级开始向下逐层查找:在当前层级的节点列表中,匹配与当前路径段同名、同类型的节点
    • 若匹配到已有节点,将遍历指针移动到该文件夹节点的children数组,继续处理下一个路径段
    • 若未匹配到节点,则新建对应类型的节点(非末尾段为文件夹,需附带空children数组;末尾段为文件,无children属性),插入当前层级后,将指针移动到新文件夹的children数组继续遍历
  • 所有路径处理完成后,根层级数组即为最终的结构化目录树

格式规则校准

原示例给出的目标结构存在两处语法偏差,实际生成的合法结构化对象需遵循以下规范:

  • 文件节点固定结构:{"type": "file", "name": "具体文件名"}
  • 文件夹节点固定结构:{"type": "folder", "name": "文件夹名称", "children": []}
  • 根层级直接为数组,无需额外嵌套对象包装

参考可运行实现

/**
 * 扁平路径列表构建嵌套目录树
 * @param {string[]} pathList 输入的扁平路径数组
 * @returns {object[]} 嵌套结构的目录树
 */
function buildDirectoryTree(pathList) {
  const rootNodes = [];
  // 通用节点匹配方法
  const findExistingNode = (nodeList, nodeType, nodeName) => 
    nodeList.find(node => node.type === nodeType && node.name === nodeName);

  for (const rawPath of pathList) {
    // 拆分路径并过滤空段,兼容连续斜杠、首尾斜杠场景
    const pathSegments = rawPath.split('/').filter(Boolean);
    let currentLevelNodes = rootNodes;

    pathSegments.forEach((segment, index) => {
      const isLastSegment = index === pathSegments.length - 1;
      const currentNodeType = isLastSegment ? 'file' : 'folder';
      let targetNode = findExistingNode(currentLevelNodes, currentNodeType, segment);

      // 节点不存在则新建
      if (!targetNode) {
        targetNode = {
          type: currentNodeType,
          name: segment,
          // 仅文件夹节点需要children属性
          ...(currentNodeType === 'folder' ? { children: [] } : {})
        };
        currentLevelNodes.push(targetNode);
      }

      // 文件夹层级将指针移动到children,处理下一层路径
      if (currentNodeType === 'folder') {
        currentLevelNodes = targetNode.children;
      }
    });
  }
  return rootNodes;
}

// 针对示例输入的测试
const testInput = [
  'sample.jpg',
  'photos/sample1.jpg',
  'photos/2006/sample2.jpg',
  'photos/2007//sample3.jpg'
];
const generatedTree = buildDirectoryTree(testInput);

边界场景兼容说明

  • 重复路径:同一路径重复输入时,不会重复创建节点,后续内容会直接挂载到已有节点下
  • 无扩展名的路径段:只要是路径数组的最后一段,就会被判定为文件节点,不受文件格式影响
  • 空路径输入:拆分后为空的路径段会被自动过滤,不会生成名称为空的无效文件夹节点

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 21:15:02