SunShare
V2EX  ›  Node.js

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

  •  
  •   SunShare · Jun 8, 2019 · 4875 views
    This topic created in 2608 days ago, the information mentioned may be changed or developed.

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

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

    举例说明如下:

    目录结构为:

    --  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。这样需要要解析处理,这里略过了。

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

    5 replies    2019-06-09 13:27:26 +08:00
    zbinlin
        1
    zbinlin  
       Jun 9, 2019
    递归遍历时,不要传全局变量的那个 cache,而是只需要传当前目录在 cache 里的引用对象就可以了。

    示例:
    gist

    github.com/zbinlin/3d8605394cda60adc8d624f45c855ca4
    zbinlin
        2
    zbinlin  
       Jun 9, 2019
    发 gist 居然需要验证?

    GIST。github。com/zbinlin/3d8605394cda60adc8d624f45c855ca4
    binux
        3
    binux  
       Jun 9, 2019 via iPhone
    这都什么鬼,你先把编程语言教程看完再来看这个问题
    SunShare
        4
    SunShare  
    OP
       Jun 9, 2019
    @zbinlin gist 404 啦。

    我是想,如果读取到很深的文件,而此时比较浅的层次 还没有在 cache 赋值,这样还得去赋值。
    skypyb
        5
    skypyb  
       Jun 9, 2019 via Android
    。。。你搞个多路树然后递归文件夹不就完事了么
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3732 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 05:10 · PVG 13:10 · LAX 22:10 · JFK 01:10
    ♥ Do have faith in what you're doing.