Javascript 从包含路径的字符串列表创建树
请参见下面的编辑 我想尝试从路径列表中创建一个树,并从另一个问题的stackoverflow中找到了这段代码,它似乎工作得很好,但我想删除空的子数组,而不是让它们显示为零项 我尝试计算r[name].result length,并仅当它大于零时才推它,但最终在任何节点上都没有子节点Javascript 从包含路径的字符串列表创建树,javascript,path,tree,Javascript,Path,Tree,请参见下面的编辑 我想尝试从路径列表中创建一个树,并从另一个问题的stackoverflow中找到了这段代码,它似乎工作得很好,但我想删除空的子数组,而不是让它们显示为零项 我尝试计算r[name].result length,并仅当它大于零时才推它,但最终在任何节点上都没有子节点 let paths = ["About.vue","Categories/Index.vue","Categories/Demo.vue","Ca
let paths = ["About.vue","Categories/Index.vue","Categories/Demo.vue","Categories/Flavors.vue","Categories/Types/Index.vue","Categories/Types/Other.vue"];
let result = [];
let level = {result};
paths.forEach(path => {
path.split('/').reduce((r, name, i, a) => {
if(!r[name]) {
r[name] = {result: []};
r.result.push({name, children: r[name].result})
}
return r[name];
}, level)
})
console.log(result)
编辑
我不想直接询问我使用它的目的,但如果它有帮助,我会尝试创建这样一个数组:(这是ng zorro cascader所需配置的复制粘贴)
从这样的平面场阵列中:
let paths = ["About.vue","Categories/Index.vue","Categories/Demo.vue","Categories/Flavors.vue","Categories/Types/Index.vue","Categories/Types/Other.vue"];
我建议使用不同的方法 这种方法采用对象而不是数组来达到更深的层次,并且仅当需要嵌套的层次时才指定数组
let path=[“About.vue”、“Categories/Index.vue”、“Categories/Demo.vue”、“Categories/Flavors.vue”、“Categories/Types/Index.vue”、“Categories/Types/Other.vue”],
结果=路径
.reduce((父级,路径)=>{
path.split('/').reduce((r,name,i,{length})=>{
让temp=(r.children???=[]).find(q=>q.name===name);
if(!temp)r.children.push(temp={name,…(i+1===length&&{isLeaf:true});
返回温度;
},家长);
返回父母;
},{儿童:[]})
儿童
console.log(结果)
.as控制台包装{max height:100%!important;top:0;}
我建议使用不同的方法
这种方法采用对象而不是数组来达到更深的层次,并且仅当需要嵌套的层次时才指定数组
let path=[“About.vue”、“Categories/Index.vue”、“Categories/Demo.vue”、“Categories/Flavors.vue”、“Categories/Types/Index.vue”、“Categories/Types/Other.vue”],
结果=路径
.reduce((父级,路径)=>{
path.split('/').reduce((r,name,i,{length})=>{
让temp=(r.children???=[]).find(q=>q.name===name);
if(!temp)r.children.push(temp={name,…(i+1===length&&{isLeaf:true});
返回温度;
},家长);
返回父母;
},{儿童:[]})
儿童
console.log(结果)
作为控制台包装{max height:100%!重要;top:0;}
感谢您的回复。。。???=在JS中做什么。我想我以前从未在这行看到过:let temp=(r.children???=[])。find(q=>q.name==name);这是一个。谢谢,它工作得很好(在更新typescript以支持逻辑空值之后)。Nina,当子项为空/缺少时,是否有任何方法可以修改它以添加isLeaf:true?谢谢你的回复。。。???=在JS中做什么。我想我以前从未在这行看到过:let temp=(r.children???=[])。find(q=>q.name==name);这是一个。谢谢,它工作得很好(在更新typescript以支持逻辑空值之后)。Nina,当子项为空/缺少时,是否有任何方法可以修改它以添加isLeaf:true?谢谢
let paths = ["About.vue","Categories/Index.vue","Categories/Demo.vue","Categories/Flavors.vue","Categories/Types/Index.vue","Categories/Types/Other.vue"];