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

如何用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"
// ]

代码说明

  1. 递归函数traverseFolders:接收当前节点和当前路径前缀,每次调用先拼接出当前节点的完整路径。
  2. 判断条件:只有当节点的files属性存在且数组不为空时,才将当前路径加入结果集,因为这说明该节点有子文件夹。
  3. 递归遍历:对每个子节点递归调用函数,传递更新后的路径前缀,确保子节点的路径能正确拼接上级路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:40:31