Javascript 基于对象数组生成树

Javascript 基于对象数组生成树,javascript,angular,tree,Javascript,Angular,Tree,我想以以下形式生成一棵树: [ { folder: 'src', children: [ { folder: 'app', children: [ { file: 'app.module.ts', status: 'M' }, { folder: 'components', children: [ { folder: 'acco

我想以以下形式生成一棵树:

[
  {
  folder: 'src',
  children: [
    {
      folder: 'app',
      children: [
        { file: 'app.module.ts', status: 'M' },
        {
          folder: 'components',
          children: [
            { 
              folder: 'accordion',
              children: [
                { file: 'accordion.components.scss', status: 'M'}
              ]
            },
            {
              folder: 'file-diff-commit',
              children: [
                { file: 'file-diff-commit.component.html', status: 'A' },
                { file: 'file-diff-commit.component.ts', status: 'A' }
              ]
            }
          ]
        },
        {
          folder: 'models',
          children: [
            { file: 'MockGitService.ts' , status: 'M' },
            { file: 'MockLeftPanelService.ts', status: 'M'} 
          ]
        }
      ]
    },
    {
      folder: 'assets'
      children: [

      ]
    }
  ]
},
{ file: 'package.json', status: 'M' },
{ file: 'yarn.lock', status: 'M' }
]
我需要使用一个对象数组来生成。例如:

[
  { status: "M", path: "src/app/app.module.ts" },
  { status: "M", path: "src/app/components/accordion/accordion.component.scss" },
  { status: "A", path: "src/app/components/file-diff-commit/file-diff-commit.component.html" },
  { status: "A", path: "src/app/components/file-diff-commit/file-diff-commit.component.ts" },
  { status: "M", path: "src/app/models/MockGitService.ts" },
  { status: "M", path: "src/app/models/MockLeftPanelService.ts" },
  { status: "M", path: "src/assets/i18n/en.json" },
  { status: "M", path: "src/assets/i18n/fr.json" },
  { status: "M", path: "package.json" },
  { status: "M", path: "yarn.lock" }
]
我不是要一个完整的方法,而是要一个小小的线索来指导我的研究。从我在互联网上查看的内容来看,我只找到了使用索引生成的树,但我更倾向于使用路径寻找逻辑


欢迎任何帮助。提前感谢。

您可以对对象采用迭代方法,对拆分的目录和最终文件采用递归方法

在递归中,实际级别将搜索具有所需目录名的对象,如果未找到,将使用
文件夹
子对象
生成一个新对象

最后,文件对象被推到最后一级

var data=[{status:“M”,path:“src/app/app.module.ts”},{status:“M”,path:“src/app/components/accordion/accordion.component.scss”},{status:“A”,path:“src/app/components/file diff commit/file diff commit.component.html”},{status:“M”,路径:“src/app/models/MockGitService.ts”},{status:“M”,路径:“src/app/models/MockLeftPanelService.ts”},{status:“M”,路径:“src/assets/i18n/fr.json”},{status:“M”,路径:“package.json”},{status:“M”,路径:“yarn.lock”},
树=[];
data.forEach({status,path})=>{
var dirs=path.split('/'),
file=dirs.pop();
迪尔斯
.reduce((级别、文件夹)=>{
var object=level.find(o=>o.folder==folder);
如果(!对象){
推送(对象={文件夹,子项:[]});
}
返回对象。子对象;
},树)
.push({file,status});
});
控制台日志(树)
。作为控制台包装{最大高度:100%!重要;顶部:0;}