如何用JavaScript提取嵌套文件夹对象数组的有效路径?
提取嵌套文件夹中含子目录的层级路径
问题描述
给定如下JSON格式的嵌套文件夹结构:
[{ "name": "Knowledge Base", "files": [ { "name": "Documents", "files": [ { "name": "Quarterly Results" } ] }, { "name": "Favourites", "files": [ { "name": "Brawl Stars", "files": [ { "name": "NS dying in 5 seconds" }, { "name": "Josiah raping NS" } ] }, { "name": "Coding", "files": [ { "name": "Coding is so fun" }, { "name": "I love svelte", "files": [ { "name": "REPL" }, { "name": "oh nooo" } ] } ] }, { "name": "Favourites 1" }, { "name": "Favourites 2" }, { "name": "Favourites 3" } ] }, { "name": "Knowledge Base 1" } ] }]
需要提取所有包含子文件夹的层级路径(忽略无下级文件夹的文件),期望输出:
- Knowledge Base > Documents
- Knowledge Base > Favourites > Brawl Stars
- Knowledge Base > Favourites > Coding
- Knowledge Base > Favourites > Coding > I love svelte
递归实现方案
用递归遍历每个节点,核心逻辑是:只有当节点存在files子数组且不为空时,才记录该节点的完整路径,再递归处理其子节点。
以JavaScript为例,代码实现如下:
// 输入的文件夹结构 const folderStructure = [{ "name": "Knowledge Base", "files": [ { "name": "Documents", "files": [ { "name": "Quarterly Results" } ] }, { "name": "Favourites", "files": [ { "name": "Brawl Stars", "files": [ { "name": "NS dying in 5 seconds" }, { "name": "Josiah raping NS" } ] }, { "name": "Coding", "files": [ { "name": "Coding is so fun" }, { "name": "I love svelte", "files": [ { "name": "REPL" }, { "name": "oh nooo" } ] } ] }, { "name": "Favourites 1" }, { "name": "Favourites 2" }, { "name": "Favourites 3" } ] }, { "name": "Knowledge Base 1" } ] }]; // 存储结果的数组 const resultPaths = []; // 递归函数 function traverseFolders(node, currentPath = '') { // 拼接当前节点的路径 const newPath = currentPath ? `${currentPath} > ${node.name}` : node.name; // 检查当前节点是否有子文件夹(files存在且不为空) if (node.files && node.files.length > 0) { // 记录该路径 resultPaths.push(newPath); // 递归遍历所有子节点 node.files.forEach(child => { traverseFolders(child, newPath); }); } } // 启动递归遍历根节点 folderStructure.forEach(root => traverseFolders(root)); // 输出结果 console.log(resultPaths); // 输出内容: // [ // "Knowledge Base > Documents", // "Knowledge Base > Favourites > Brawl Stars", // "Knowledge Base > Favourites > Coding", // "Knowledge Base > Favourites > Coding > I love svelte" // ]
代码说明
- 递归函数
traverseFolders:接收当前节点和当前路径前缀,每次调用先拼接出当前节点的完整路径。 - 判断条件:只有当节点的
files属性存在且数组不为空时,才将当前路径加入结果集,因为这说明该节点有子文件夹。 - 递归遍历:对每个子节点递归调用函数,传递更新后的路径前缀,确保子节点的路径能正确拼接上级路径。
内容的提问来源于stack exchange,提问作者user20840709
相关产品推荐
相关产品推荐

