如何生成嵌套对象格式的目录层级,直到读取到.dcm格式文件
问题原因分析
- 异步调用未等待执行完成:
make_dir是异步函数,返回值为Promise对象,你没有使用await等待执行完成就直接赋值给sub_dir字段,因此该字段会显示为pending状态的Promise。 - 提前终止当前层级处理:你在
forEach遍历到第一个非.dcm后缀的文件时就直接调用resolve返回结果,直接中断了当前层级其余文件的遍历逻辑,无法处理多子目录、同时存在子目录和dcm文件的场景。 - 层级判断逻辑缺失:没有先判断当前层级的文件类型构成,无法区分「存在子目录要继续嵌套」和「全为dcm文件要返回文件名数组」两种场景。
修复后代码
const fs = require('fs/promises'); const path = require('path'); async function makeDir(currentPath) { // 读取当前目录下所有文件,同时获取文件类型避免误判带后缀的目录 const files = await fs.readdir(currentPath, { withFileTypes: true }); // 分别筛选子目录和dcm格式文件 const subDirs = files.filter(file => file.isDirectory()); const dcmFiles = files.filter(file => file.isFile() && file.name.endsWith('.dcm')).map(file => file.name); // 符合预期规则:当前层级无子目录、仅存在dcm文件时直接返回文件名数组 if (subDirs.length === 0) { return dcmFiles; } // 适配你示例的单层级嵌套结构,多子目录场景可调整为返回子目录对象数组 const targetDir = subDirs[0]; return { dir_name: targetDir.name, sub_dir: await makeDir(path.join(currentPath, targetDir.name)) } } // 调用示例,外层需要用await或者then获取最终结果 async function main() { const result = { dir_name: 'test', sub_dir: await makeDir('./test') } console.log(JSON.stringify(result, null, 2)); } main();
如果业务场景中同一层级允许存在多个子目录,可以调整sub_dir字段为子目录对象数组,适配实际需求即可。
内容的提问来源于stack exchange,提问作者Courtesy
相关产品推荐
相关产品推荐

