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

如何在嵌套对象数组中按name值获取对应files内容(支持深层嵌套)

解决嵌套文件夹结构中按名称获取对应层级文件的问题

问题背景

我有一个定义文件夹结构的folders.json,内容是嵌套对象数组——带name和files属性的是文件夹,其他是文件。需求是给定文件夹的name值,获取该文件夹下的所有files内容,但之前用root.filter(item => item.name === currentFolder).map(item => item.files)只能处理两层结构,深层嵌套的文件夹没法匹配,需要在SvelteKit里实现支持任意深度的方案。

解决方案:递归查找函数

核心思路是写一个递归函数,遍历整个嵌套结构,找到匹配名称的文件夹后返回其files,找不到就继续递归遍历子文件夹:

function findFolderFiles(folderStructure, targetName) {
  for (const item of folderStructure) {
    // 判断当前项是否为文件夹
    if (item.files) {
      // 匹配到目标文件夹,直接返回其files
      if (item.name === targetName) {
        return item.files;
      }
      // 递归查找子文件夹层级
      const subFolderResult = findFolderFiles(item.files, targetName);
      if (subFolderResult) {
        return subFolderResult;
      }
    }
  }
  // 未找到匹配文件夹时返回null,也可以根据需求返回空数组
  return null;
}

SvelteKit中的使用示例

1. 在页面组件中使用

假设folders.json放在src/data目录下,在+page.js或+page.server.js中导入并调用函数:

import folders from '$data/folders.json';

export function load() {
  // 查找名为"Favourites"的文件夹下的文件
  const targetFiles = findFolderFiles(folders, "Favourites") || [];
  return { targetFiles };
}

// 递归查找函数
function findFolderFiles(folderStructure, targetName) {
  for (const item of folderStructure) {
    if (item.files) {
      if (item.name === targetName) {
        return item.files;
      }
      const subResult = findFolderFiles(item.files, targetName);
      if (subResult) return subResult;
    }
  }
  return null;
}

之后就可以在对应的Svelte组件中通过data.targetFiles拿到结果。

2. 处理多同名文件夹的情况

如果存在多个同名文件夹,想要收集所有匹配结果,可以修改函数返回数组:

function findAllFolderFiles(folderStructure, targetName) {
  let matchedFiles = [];
  for (const item of folderStructure) {
    if (item.files) {
      if (item.name === targetName) {
        matchedFiles.push(item.files);
      }
      // 递归收集子文件夹中的匹配项
      matchedFiles = matchedFiles.concat(findAllFolderFiles(item.files, targetName));
    }
  }
  return matchedFiles;
}

说明

  • 单结果版本的函数会从上到下、从左到右遍历结构,找到第一个匹配的文件夹就返回;
  • 如果需要区分文件夹和文件,也可以在判断时结合type属性,但核心逻辑不变;
  • 可以把递归函数抽离到单独的工具文件(比如src/utils/folderUtils.js)中,方便多个组件复用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:40:24