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;}