如何在嵌套对象数组中按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
相关产品推荐
相关产品推荐

