Nodejs 关于将指定目录结构映射到某一个对象上,要求嵌套结构保持一致

发布于 1周前 作者 yibo5220 来自 nodejs/Nestjs

Nodejs 关于将指定目录结构映射到某一个对象上,要求嵌套结构保持一致

为了完成某个自动化处理目录里数据,期望有这样到映射结果。

因为目录里到文件和深度是动态的,需要一个通用的方法处理目录里的数据。

举例说明如下:

目录结构为:

--  A
  -- a1.json
  -- AA
     -- a2.json
     -- a3.json
-- B
  -- b1.json

映射为 cache 对象(目录结构和对象深度结构一致):

let cache= {
 A: {
   a1: {   /* a1.json 文件内容 或 其他 */  },
    AA: {
        a2: {  /* a2.json 文件内容 或 其他 */ },
    }
 },
 B: { 
    b1: {  /* b1.json 文件内容 或 其他 */ },
 }
}

目前大致的做法是递归遍历目录,然后将目录结构赋值给一个全局变量(假设为 cache ),但遇到一个问题,递归时,取到某个文件的嵌套结构(比如 文件 A/AA/a2.json 假设取到 key_path="A/AA/a2" ),在给全局变量 cache 赋值时,怎么深层次对象赋值?(即如何给 cache 读取并赋值,其中深度为 key_path="A/AA/a2"

目前 eval 来赋值,如:

let _path =  key_path.replace(key_path)
eval("cache." + _path  + "= 'a2 data' ") ;

当然上层可能还没被赋值,即浅深度 cahce[A], cahce[A][AA]的 值可能是 undefined。这样需要要解析处理,这里略过了。

请问,你们是如何处理这样的问题吗?或者有其他方式?


6 回复

递归遍历时,不要传全局变量的那个 cache,而是只需要传当前目录在 cache 里的引用对象就可以了。

示例:
gist

github.com/zbinlin/3d8605394cda60adc8d624f45c855ca4


发 gist 居然需要验证?

GIST。github。com/zbinlin/3d8605394cda60adc8d624f45c855ca4

这都什么鬼,你先把编程语言教程看完再来看这个问题

gist 404 啦。

我是想,如果读取到很深的文件,而此时比较浅的层次 还没有在 cache 赋值,这样还得去赋值。

。。。你搞个多路树然后递归文件夹不就完事了么

在Node.js中,你可以使用递归函数来遍历指定目录结构并将其映射到一个嵌套的对象上。以下是一个示例代码,展示了如何实现这个功能:

const fs = require('fs');
const path = require('path');

function dirToObject(dirPath) {
    let obj = {};

    function traverseDir(currentDirPath) {
        const files = fs.readdirSync(currentDirPath);

        files.forEach(file => {
            const filePath = path.join(currentDirPath, file);
            const relativePath = path.relative(dirPath, filePath);
            const parts = relativePath.split(path.sep);

            let current = obj;
            for (let i = 0; i < parts.length - 1; i++) {
                if (!current[parts[i]]) {
                    current[parts[i]] = {};
                }
                current = current[parts[i]];
            }

            const isDir = fs.statSync(filePath).isDirectory();
            current[parts[parts.length - 1]] = isDir ? {} : filePath;

            if (isDir) {
                traverseDir(filePath);
            }
        });
    }

    traverseDir(dirPath);
    return obj;
}

// 使用示例
const dirStruct = dirToObject('./your-directory-path');
console.log(JSON.stringify(dirStruct, null, 2));

这段代码定义了一个dirToObject函数,该函数接受一个目录路径作为参数,并返回一个嵌套的对象,该对象的结构与目录结构一致。traverseDir函数用于递归遍历目录,并将每个文件和目录添加到对象中。

注意,在代码中替换'./your-directory-path'为你实际要映射的目录路径。

回到顶部