Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.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_Angular_Typescript_Mapping - Fatal编程技术网

如何在Javascript中将字符串数组转换为特定的树结构

如何在Javascript中将字符串数组转换为特定的树结构,javascript,angular,typescript,mapping,Javascript,Angular,Typescript,Mapping,我从后端获得一个文件路径列表,它表示一个文件夹结构,如下所示: paths = ["path/to/file1.doc", "path/to/file2.doc", "foo/bar.doc] 路径的长度是任意的。为了使用文件树组件(),我需要将此数据转换为: 我认为转换数据最有效的方法是 首先将阵列与镜像树结构的文件映射,然后映射到 迭代每个键,以最终确定“子/父”关系 第一步: transformToTree(data) { const tree = {}; functio

我从后端获得一个文件路径列表,它表示一个文件夹结构,如下所示:

paths = ["path/to/file1.doc", "path/to/file2.doc", "foo/bar.doc]
路径的长度是任意的。为了使用文件树组件(),我需要将此数据转换为:

我认为转换数据最有效的方法是

  • 首先将阵列与镜像树结构的文件映射,然后映射到
  • 迭代每个键,以最终确定“子/父”关系
  • 第一步:

    transformToTree(data) {
        const tree = {};
        function addPathsToTree(paths) {
            let map = tree
            paths.forEach(function(item) {
                map[item] = map[item] || {};
                map = map[item];
            });
        }
        data.forEach(function(path) {
            let pathPart = path.split('/');
            addPathsToTree(pathPart);
        });
        return pathTree;
    }
    
    将“节点”传递到transformToTree函数(transformToTree(节点))时,我得到以下结果:

    {
        "path": {
            "to": {
                "file1.doc": {},
                "file2.doc": {}
            }
        },
        "foo": {
            "bar": {}
        }
    }
    
    我不知道如何从这里开始=如何迭代所有键和值,同时在所需结构中构建最终数组


    有几个这样或那样的例子,但我不知道如何使它们适应我的需要。

    我会使用两个嵌套循环,一个用于路径,一个用于拆分的名称,然后找到名称或创建新对象

    var path=[“path/to/file1.doc”、“path/to/file2.doc”、“foo/bar.doc”],
    结果=[];
    路径减少((r,路径)=>{
    path.split('/').reduce((o,name)=>{
    var temp=(o.children=o.children | |[]).find(q=>q.name==name);
    if(!temp)o.children.push(temp={name});
    返回温度;
    },r);
    返回r;
    },{儿童:结果});
    控制台日志(结果)
    
    .as控制台包装{最大高度:100%!重要;顶部:0;}
    Smart。非常感谢你的帮助!
    {
        "path": {
            "to": {
                "file1.doc": {},
                "file2.doc": {}
            }
        },
        "foo": {
            "bar": {}
        }
    }