首页 > 解决方案 > 将基于子数组索引的数组数组合并为键(NodeJS/Javascript)

问题描述

如何编写代码以下列方式合并我的列表?性能很重要。我想转换以下数组:

"list": [
    [
        "marketing",
        "page_sections",
        "PageOne"
    ],
    [
        "marketing",
        "page_sections",
        "PageTwo"
    ],
    [
        "webapp",
        "page",
        "pageone"
    ],
    [
        "webapp",
        "page",
        "pagetwo"
    ],

转为以下格式:

[   
    {
     name: "marketing",
     path: "marketing/",           
     children: [
                    {
                        name: "page_sections",
                        path: "marketing/page_sections", 
                        children: [
                            {
                                name: "pageOne",
                                path: "marketing/page_sections/pageOne", 
                                children: []
                            },
                            {
                                name: "pageTwo",
                                path: "marketing/page_sections/pageTwo", 
                                children: []
                            },
                       }
           ],
     },
    {
     name: "webapp",
     path: "webapp/"
     children: [
                  {
                    name: "page",
                    path: "webapp/page/"
                    
                    children: [
                        {
                            name: "pageone",
                            path: "webapp/page/pageone"
                            children: []
                        },
                        {
                            name: "pagetwo",
                            path: "webapp/page/pagetwo"
                            children: []
                        },
                    }
             ]
     },
]

子数组的第一个索引是父级,第二个索引是父级的子级,第三个索引是第二个索引的子级(依此类推)。

标签: javascriptnode.jsarraysreactjs

解决方案


最短的方法是迭代嵌套名称并查找具有相同名称的对象。如果不存在,则创建一个新对象。children将数组作为新级别返回。

这种方法的特点Array#reduce是迭代外部数组data和所有内部数组。

const
    data = [["marketing", "page_sections", "PageOne"], ["marketing", "page_sections", "PageTwo"], ["webapp", "page", "pageone"], ["webapp", "page", "pagetwo"]],
    result = data.reduce((r, names) => {
        names.reduce((level, name, i, values) => {
            let temp = level.find(q => q.name === name),
                path = values.slice(0, i + 1).join('/') + (i ? '' : '/');
            if (!temp) level.push(temp = { name, path, children: [] });
            return temp.children;
        }, r);
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读