代码之家  ›  专栏  ›  技术社区  ›  Ashish Rawat

如何将数组数组转换为深嵌套树视图

  •  6
  • Ashish Rawat  · 技术社区  · 7 年前

    我正在通过将路径数组转换为树视图数据结构来构建树视图。以下是我想做的:

    // routes are sorted.
    let routes = [
        ['top', '1.jpg'],
        ['top', '2.jpg'],
        ['top', 'unsplash', 'photo.jpg'],
        ['top', 'unsplash', 'photo2.jpg'],
        ['top', 'foo', '2.jpg'],
        ['top', 'foo', 'bar', '1.jpg'],
        ['top', 'foo', 'bar', '2.jpg']
    ];
    
    into 
    
    let treeview = {
      name: 'top', child: [
        {name: '1.jpg', child: []},
        {name: '2.jpg', child: []},
        {name: 'unsplash', child: [
            {name: 'photo.jpg', child: []},
            {name: 'photo2.jpg', child: []}
        ]},
        {name: 'foo', child: [
            {name: '2.jpg', child: []},
            {name: 'bar', child: [
                {name: '1.jpg', child: []},
                {name: '2.jpg', child: []}
            ]}
        ]}
    ]}
    

    现在,我已经通过此方法成功地转换了单个项目数组,但无法对多个数组进行转换。还要注意,嵌套的treeview不包含重复项。

    function nest(arr) {
        let out = [];
        arr.map(it => {
            if(out.length === 0) out = {name: it, child: []}
            else {
                out = {name: it, child: [out]}
            }
        });
        return out;
    }
    
    1 回复  |  直到 6 年前
        1
  •  8
  •   Nina Scholz    7 年前

    可以使用嵌套哈希表访问路由,并将数组作为结果集。如果只有一个根元素,则可以获取结果数组的第一个元素。

    var routes = [['top', '1.jpg'], ['top', '2.jpg'], ['top', 'unsplash', 'photo.jpg'], ['top', 'unsplash', 'photo2.jpg'], ['top', 'foo', '2.jpg'], ['top', 'foo', 'bar', '1.jpg'], ['top', 'foo', 'bar', '2.jpg']],
        result = [],
        temp = { _: result };
    
    routes.forEach(function (path) {
        path.reduce(function (level, key) {
            if (!level[key]) {
                level[key] = { _: [] };
                level._.push({ name: key, children: level[key]._ });
            }
            return level[key];
        }, temp);
    });
    
    console.log(result);    
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    ES6没有临时对象,但具有路径名命名对象的搜索。

    var routes = [['top', '1.jpg'], ['top', '2.jpg'], ['top', 'unsplash', 'photo.jpg'], ['top', 'unsplash', 'photo2.jpg'], ['top', 'foo', '2.jpg'], ['top', 'foo', 'bar', '1.jpg'], ['top', 'foo', 'bar', '2.jpg']],
        result = [];
    
    routes.forEach(function (path) {
        path.reduce(function (level, key) {
            var temp = level.find(({ name }) => key === name);
            if (!temp) {
                temp = { name: key, children: [] };
                level.push(temp);
            }
            return temp.children;
        }, result);
    });
    
    console.log(result);    
    .作为控制台包装{最大高度:100%!重要;顶部:0;}