Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.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_Path_Tree - Fatal编程技术网

Javascript 从包含路径的字符串列表创建树

Javascript 从包含路径的字符串列表创建树,javascript,path,tree,Javascript,Path,Tree,请参见下面的编辑 我想尝试从路径列表中创建一个树,并从另一个问题的stackoverflow中找到了这段代码,它似乎工作得很好,但我想删除空的子数组,而不是让它们显示为零项 我尝试计算r[name].result length,并仅当它大于零时才推它,但最终在任何节点上都没有子节点 let paths = ["About.vue","Categories/Index.vue","Categories/Demo.vue","Ca

请参见下面的编辑

我想尝试从路径列表中创建一个树,并从另一个问题的stackoverflow中找到了这段代码,它似乎工作得很好,但我想删除空的子数组,而不是让它们显示为零项

我尝试计算r[name].result length,并仅当它大于零时才推它,但最终在任何节点上都没有子节点

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"];