将字符串转换为嵌套对象和数组

我在一个项目中,前一个家伙做了一些奇怪的路由,基本上我从有满足感的子弹中得到了我以字符串形式放置在数组["/api/","/docs/getting-started/","/docs/,"/plugin/","/plugin/user/","/plugin/profile/"......]

中的信息。

现在我需要将其转换为数组形式

let cleanedSidebarContents = [{
              title:null,pages:[
                     {title:"api",path:"/api/"
                      },{title:"docs",path:"/docs/"
                      },{title:"plugin",path:"/plugin/"
                      },]
               },{
              title:"plugin",pages:[
                     {title:"user",path:"/plugin/user/"
                      },{title:"profile",path:"/plugin/profile/"
                      },{
              title:"docs",pages:[
                     {title:"getting-started",path:"/plugin/getting-started/"
                      },]
               }
]

所以目前我正在做什么-

 //-------Format sidebar data--------------->
    let cleanedSidebarContents = [];
    (function cleanSidebarContents() {

        let sideBarContentsContentful = [];
        cleanContentfulEdges.forEach(edge => {
            let slug = edge.node.slug;
            //split string into titles and remove empty spaces
            let routeMapArray = slug.split("/").filter(x => x != "");
            if (routeMapArray.length > 1) {
                sideBarContentsContentful.push({
                    title: routeMapArray[0],page: {
                        title: routeMapArray[routeMapArray.length - 1],path: edge.node.slug
                    }
                });
            } else {
                sideBarContentsContentful.push({
                    title: null,path: edge.node.slug
                    }
                });
            }
        });

        let titles = [];
        for (let i = 0; i < sideBarContentsContentful.length; i++) {
            titles.push(sideBarContentsContentful[i].title);
        }
        //clean duplicate entries
        titles = titles.filter(function (item,index,inputArray) {
            return inputArray.indexOf(item) === index;
        });
        titles.sort();

        titles.map(item => {
            cleanedSidebarContents.push({
                title: item,pages: []
            })
        });

        sideBarContentsContentful.forEach(item => {
            for (let i = 0; i < cleanedSidebarContents.length; i++) {
                if(cleanedSidebarContents[i].title === item.title){
                    cleanedSidebarContents[i].pages.push(item.page)
                }
            }
        });
    }());
    //----------------------------------------->

我首先要拆分所有字符串,然后将标题放入titles数组中,然后删除重复项并相应地映射数据。

我只是觉得这是非常糟糕的代码,还有一种更好的方法我无法弄清楚。

chenga1972 回答:将字符串转换为嵌套对象和数组

您可以创建一个mapper对象,该对象将输出中的对象与每个对象的根中的title映射。在split的{​​{1}}处获取所有路径块。 /删除从字符串开头和结尾创建的所有空字符串。如果只有一个匹配项,则它属于默认的.filter(Boolean)对象。否则,请使用null中的第一个密钥作为累加器中的密钥。

matches

本文链接:https://www.f2er.com/3016023.html

大家都在问