跪求用js/ts方法解决以下数据格式转换?

作者站长头像
站长
· 阅读数 19

请教一下各位大神怎么把下面的原始数据变成目标数据。就相当于把所有的 key 一层一层拼接起来,组成所需路径,存在当前层级中。(数据层级深度完全随机)

// 原始数据
let fileInfo = [
  {
    code: [
      {
        scripts: [
          {
            server: [
              {
                bd: [ 'init.ts', 'index.tsx' ],
                data: [
                  'init.ts',
                  'app.tsx',
                  {
                    test: [
                      {
                        res: [ 'config.ts' ]
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]
// 目标数据
let fileInfo = [
  {
    pathName: 'code',
    code: [
      {
        pathName: 'code/scripts',
        scripts: [
          {
            pathName: 'code/scripts/server',
            server: [
              {
                pathName: 'code/scripts/server/bd',
                bd: [
                  {
                    pathName: 'code/scripts/server/bd/init.ts',
                    value: 'init.ts'
                  }, 
                  {
                    pathName: 'code/scripts/server/bd/index.tsx',
                    value: 'index.tsx'
                  }
                ]
              },
              {
                pathName: 'code/scripts/server/data',
                data: [
                  {
                    pathName: 'code/scripts/server/data/init.ts',
                    value: 'init.ts'
                  },
                  {
                    pathName: 'code/scripts/server/data/app.tsx',
                    value: 'app.tsx'
                  },
                  {
                    pathName: 'code/scripts/server/data/test',
                    test: [
                      {
                        pathName: 'code/scripts/server/data/test/res',
                        res: [
                          {
                            pathName: 'code/scripts/server/data/test/res/config.ts',
                            value: 'config.ts'
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]
回复
1个回答
avatar
test
2024-07-12

假设你的 init.tsindex.tsxapp.tsxconfig.ts 都为字符串,只是你忘记用 ''"" 括起来了。

js 代码

let f = (a, p = []) => a.flatMap(i => typeof(i) === 'string' ? {
        pathName: [...p, i].join('/'),
        value: i,
    } : Object.entries(i).map(([k, v]) => ({
        pathName: [...p, k].join('/'),
        [k]: f(v, [...p, k]),
    }))
);

使用

f(fileInfo)

结果

[
  {
    "pathName": "code",
    "code": [
      {
        "pathName": "code/scripts",
        "scripts": [
          {
            "pathName": "code/scripts/server",
            "server": [
              {
                "pathName": "code/scripts/server/bd",
                "bd": [
                  {
                    "pathName": "code/scripts/server/bd/init.ts",
                    "value": "init.ts"
                  },
                  {
                    "pathName": "code/scripts/server/bd/index.tsx",
                    "value": "index.tsx"
                  }
                ]
              },
              {
                "pathName": "code/scripts/server/data",
                "data": [
                  {
                    "pathName": "code/scripts/server/data/init.ts",
                    "value": "init.ts"
                  },
                  {
                    "pathName": "code/scripts/server/data/app.tsx",
                    "value": "app.tsx"
                  },
                  {
                    "pathName": "code/scripts/server/data/test",
                    "test": [
                      {
                        "pathName": "code/scripts/server/data/test/res",
                        "res": [
                          {
                            "pathName": "code/scripts/server/data/test/res/config.ts",
                            "value": "config.ts"
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容