如何将指定层级的文件与文件夹列表转换为嵌套结构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
相关产品推荐
相关产品推荐

