Javascript 将数组转换为对象树[JS]

Javascript 将数组转换为对象树[JS],javascript,arrays,object,tree,javascript-objects,Javascript,Arrays,Object,Tree,Javascript Objects,人们! 这是我作为初级前端开发人员的第一个问题 我有一个函数(),它可以像这样变换平面数组: const filePaths = [ 'src/lib/git.js', 'src/lib/server.js', 'build/css/app.css', 'externs/test/jquery.js', ]; 进入对象树,如下所示: [ src: { lib: { git.js: 'file',

人们! 这是我作为初级前端开发人员的第一个问题

我有一个函数(),它可以像这样变换平面数组:

const filePaths = [
  'src/lib/git.js',
  'src/lib/server.js',
  'build/css/app.css',
  'externs/test/jquery.js',
];
进入对象树,如下所示:

[
    src: {
            lib: {
                git.js: 'file',
                server.js: 'file',
            }
    },
    build: {
        css: {
            app.css: 'file'
        }
    }
    .....
]
请帮助我了解如何重写函数,使其以以下格式输出结果:

 [
    {
         text: src,
         children: [
              {
                   text: 'lib',
                   children: [
                         {
                             text: git.js,
                             children: [
                                  {
                                      text: 'file'
                                  },
                             ]
                         }, 
                         {
                             text: server.js,
                             children: [
                                  {
                                      text: 'file'
                                  },
                             ]
                         }

                   ]
              }
         ]

    },
    {
        text: build,
        children: [
             {
                 text: app.css,
                 children: [
                      text: app.css,
                      children: [
                           {
                                text: 'file'
                           }
                      ]
                 ]
             }
        ]
    }
    .....
]
功能:

const getTree = (arr) => {
  let fileTree = [];

  function mergePathsIntoFileTree(prevDir, currDir, i, filePath) {
    if (!prevDir.hasOwnProperty(currDir)) {
      prevDir[currDir] = {};
    }

    if (i === filePath.length - 1) {
      prevDir[currDir] = 'file';
    }

    return prevDir[currDir];
  }

  function parseFilePath(filePath) {
    let fileLocation = filePath.split('/');

    if (fileLocation.length === 1) {
      return (fileTree[fileLocation[0]] = 'file');
    }

    fileLocation.reduce(mergePathsIntoFileTree, fileTree);
  }

  arr.forEach(parseFilePath);

  return fileTree;
}

提前,非常感谢

可以通过递归迭代输出对象(由
getTree
生成的对象)的键来实现这一点:

const文件路径=[
“src/lib/git.js”,
“src/lib/server.js”,
“build/css/app.css”,
'externs/test/jquery.js',
];
//构建依赖树,
//“getTree”函数的另一个版本,但更简洁
函数getTree(文件路径){
返回文件路径。减少((全部,项)=>{
设指针=null;
项目.拆分('/').forEach((el,i,arr)=>{
如果(!i)指针=全部;
如果(!pointer.hasOwnProperty(el)){
指针[el]=(i==arr.length-1)“'file':{};
}
指针=指针[el];
});
全部归还;
}, {});
}
//格式化依赖关系树以使用递归匹配所需的输出
函数buildChildTree(obj){
返回Object.keys(obj.map)(key=>{
返回{
文本:键,
子项:obj[key]=“file”?[{text:'file'}]:buildChildTree(obj[key])
}
});
}
const dependencyTree=getTree(文件路径);
const result=buildChildTree(dependencyTree);
log(JSON.stringify(result,null,2))