JavaScript实现:将字符串化目录树转换为目录列表
如何将目录树结构字符串转换为目录路径数组(JavaScript实现)
问题说明
需要实现一个JavaScript函数,把特定格式的目录树字符串转换成完整的目录路径数组。格式规则如下:
- 文件夹名后紧跟
[],方括号内是该文件夹的子项(空[]表示空文件夹) - 同一层级的子项用
&分隔 - 示例输入:
const input = "bucket[f1[a&b&f[]&ff1[a&b]]&f2[a&b&ff1[a&b]]&f3[ff1[a]]]";
- 预期输出(完整路径数组):
[ "bucket/f1/a", "bucket/f1/b", "bucket/f1/f", "bucket/f1/ff1/a", "bucket/f1/ff1/b", "bucket/f2/a", "bucket/f2/b", "bucket/f2/ff1/a", "bucket/f2/ff1/b", "bucket/f3/ff1/a" ]
之前尝试递归+正则的方案,但无法区分不同层级的&符号,导致解析错误。
解决方案:基于栈的层级解析
嵌套结构最适合用栈来跟踪当前路径层级,逐个字符解析字符串,避免正则无法处理嵌套的问题。核心思路:
- 用栈保存当前的路径层级,初始时压入根文件夹名
- 遍历字符串,提取文件夹/文件名,遇到
[时将当前文件夹压入栈,遇到]时弹出栈顶 - 遇到
&时,将当前路径(栈拼接的结果)加入结果数组(如果是文件或者空文件夹) - 处理末尾的最后一个项,避免遗漏
实现代码
function parseDirTree(input) { const result = []; const stack = []; let currentName = ""; for (let i = 0; i < input.length; i++) { const char = input[i]; if (char === "[" || char === "&" || char === "]") { // 处理当前收集的名称(文件夹或文件) if (currentName) { // 如果是遇到[,说明当前是文件夹,先处理空文件夹情况,再压栈 if (char === "[") { const currentPath = stack.length ? `${stack.join("/")}/${currentName}` : currentName; // 检查是否是空文件夹(下一个字符是]) if (input[i + 1] === "]") { result.push(currentPath); } stack.push(currentName); } else if (char === "&") { // 遇到&,拼接当前完整路径加入结果 const currentPath = stack.join("/") + "/" + currentName; result.push(currentPath); } currentName = ""; } // 遇到]时弹出栈顶,回到上一层目录 if (char === "]") { stack.pop(); } } else { // 收集文件夹/文件名的字符 currentName += char; } } return result; } // 测试示例 const input = "bucket[f1[a&b&f[]&ff1[a&b]]&f2[a&b&ff1[a&b]]&f3[ff1[a]]]"; console.log(parseDirTree(input));
代码说明
- 遍历过程中逐个收集名称字符,直到遇到
[/&/]触发处理逻辑 - 遇到
[时,先判断是否是空文件夹(下一个字符为]),如果是则直接将路径加入结果;再将当前文件夹压入栈,跟踪层级 - 遇到
&时,将栈中路径与当前名称拼接成完整路径,加入结果数组 - 遇到
]时弹出栈顶,回到父目录层级
内容的提问来源于stack exchange,提问作者Duno
相关产品推荐
相关产品推荐

