Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从字符串列表创建树-javascript_Javascript_Tree_Treeview - Fatal编程技术网

从字符串列表创建树-javascript

从字符串列表创建树-javascript,javascript,tree,treeview,Javascript,Tree,Treeview,我有一个对象数组,我想创建一个视图树。但我在创作上有个问题。我的名字Test1/Test2和Test1/Test2/Test3(ID147)在最后一个树中丢失了 我的片段: let arr=[{id:145,name:“Test1/Test2”,public:false}, {id:146,名称:“Test1/Test2/Test3”,public:false}, {id:147,名称:“Test1/Test2/Test3”,public:false}, {id:148,名称:“Test1/T

我有一个对象数组,我想创建一个视图树。但我在创作上有个问题。我的名字Test1/Test2和Test1/Test2/Test3(ID147)在最后一个树中丢失了

我的片段:

let arr=[{id:145,name:“Test1/Test2”,public:false},
{id:146,名称:“Test1/Test2/Test3”,public:false},
{id:147,名称:“Test1/Test2/Test3”,public:false},
{id:148,名称:“Test1/Test2/Test4”,public:false}];
让结果=[];
let level={result};
arr.forEach((路径)=>{
path.name.split(“/”).reduce((r,name,i,a)=>{
如果(!r[name]){
r[name]={result:[],id:path.id};
r、 push({name,children:r[name].result});
}
返回r[name];
},水平);
});

console.log(result)
如果我理解得很好,树中的叶子数应该等于输入数组中的条目数。所以一片叶子永远不会有孩子。这就是为什么要给“Test1”两个子项,即使所有路径的下一部分都是“Test2”:一个子项用于叶,另一个子项用作内部节点

因此,叶子实际上并不需要
children
属性,因为
children
数组将始终保持为空

显然,路径的最后一个元素需要以稍微不同的方式进行处理。该部分应始终导致在树中创建新节点。其他部件可以重用(非叶)节点(如果有)

这将导致您的代码发生以下更改:

让arr=[
{id:145,名称:“Test1/Test2”,public:false},
{id:146,名称:“Test1/Test2/Test3”,public:false},
{id:147,名称:“Test1/Test2/Test3”,public:false},
{id:148,名称:“Test1/Test2/Test4”,public:false}
];
让结果=[];
let level={result};
arr.forEach({name,id})=>{//destructure
让parts=name.split(“/”);
name=parts.pop();//不要通过减速器传递最后一个零件
部分减少((r,name,i)=>{
如果(!r[name]){
r[name]={result:[]};
r、 push({name,children:r[name].result});
}
返回r[name];
}.push({name,id});//在此处添加最后一部分
});

控制台日志(结果)请添加想要的结果。多个
id
会发生什么情况?@NinaScholz您好。如果您还有
“Test1/Test2/Test3/Test5”
,则添加了内容。它应该放在哪里?@NinaScholz我想,它将作为一个4元素Test3和子test5添加到Test1/Test2中,为什么没有多个
Test1
?非常感谢!