目录结构到对象结构

Huy小于 1 分钟javascriptjavascript

在项目目录中我有如下目录文件,想将其转化为对象结构:

.
├── bar
│   ├── a
│   │   ├── n1.js
│   │   └── n2.js
│   └── b
│       ├── n1.js
│       └── n2.js
└─── foo
   ├── a
   │   ├── n1.ts
   │   └── n2.ts
   └── b
       ├── n1.ts
       └── n2.ts

n1.js 为例,其内容为:

export default {
  m() {
    console.log('n1')
  },
}

代码实现

const modules = import.meta.glob(['./bar/**/*.js', './foo/**/*.ts'], {
  eager: true, // 立即加载这些文件,而不是延迟加载
  import: 'default', // 导入模式
})
console.log('🚀 ~ modules:', modules)

const result = {}

for (const path in modules) {
  const moduleDefault = modules[path] // 实际导出结果

  const matched = path.match(/[^\/\.]+/g).slice(0, -1) // 按路径分割
  console.log('🚀 ~ matched:', matched)

  let current = result // 初始上层
  for (let i = 0; i < matched.length; i++) {
    const key = matched[i]
    current[key] = current[key] || {} // 初始化层级

    if (i === matched.length - 1) {
      current[key] = moduleDefault // 最后一层赋值
    }

    current = current[key] // 更新上层
  }
}

console.log('🚀 ~ result:', result)

result.bar.a.n1.m()

打印结果

{
    "bar": {
        "a": {
            "n1": fn,
            "n2": fn
        },
        "b": {
            "n1": fn,
            "n2": fn
        }
    }
}
Loading...