Javascript groupBy按值到数组,包括(),自定义结构

Javascript groupBy按值到数组,包括(),自定义结构,javascript,vue.js,Javascript,Vue.js,我需要检查路由列表并按路径对它们进行分组,例如/mens成为包含/mens的所有其他路由的“父路由”,等等。。。我想要的结果是 const newRoutes = { "/kids": [{ "path": "/kids", "name": "kids-clothing-section", "children": [{ "path": "/kids/shoes", "name": "kids-clothing-shoes",

我需要检查路由列表并按路径对它们进行分组,例如
/mens
成为包含
/mens
的所有其他路由的“父路由”,等等。。。我想要的结果是

const newRoutes = {
  "/kids": [{
    "path": "/kids",
    "name": "kids-clothing-section",
    "children": [{
        "path": "/kids/shoes",
        "name": "kids-clothing-shoes",
      },
      {
        "path": "/kids/shirts",
        "name": "kids-clothing-shirts",
      }
    ]
  }]
}
我知道如何使用vanilla javascript(reduce)和lodash(
\uu.groupBy()
)进行分组。但其余部分对我来说太复杂了,尤其是路径匹配的部分。非常感谢你的帮助

编辑 因此,并非所有的路线都是孩子们到“家”的路线,我认为应该进行长度检查
path.lenght>3

const路由=[{
路径:“/”,
姓名:'家',
},
{
路径:'/about',
姓名:'关于',
},
{
路径:'/mens',
名称:“男装部”,
},
{
路径:'/mens/shoes',
名称:“男装鞋”,
},
{
路径:'/mens/shoes/:id',
名称:“男装鞋细节”
},
{
路径:'/kids',
名称:'儿童服装部',
},
{
路径:“/kids/shoes”,
名称:“儿童服装鞋”,
},
{
路径:'/kids/jeans',
名称:“儿童服装牛仔裤”,
},
{
路径:'/kids/shirts',
名称:“儿童服装衬衫”,
},
{
路径:'/kids/shoes/:id',
名称:“儿童服装鞋细节”
}
]
const groupedRoutes=routes.reduce(函数(obj,route){
//获取路线的路径
const path=route.path
const splitted=path.split('/')[1]
如果(!obj.hasOwnProperty(拆分)){
obj[splited]=[]
}
obj[已拆分]。推送(路由)
返回obj
}, {})

log(groupedRoutes)
也许使用数组作为结果集对您有效

const
routes=[{path:'/',name:'home'},{path:'/about',name:'about'},{path:'/mens',name:'男装部分'},{path:'/mens/shoes',name:'男装鞋'},{path:'/mens/shoes/:id',name:'男装鞋细节'},{path:'/kids',name:'童装部分'},{path:'/kids/shoes',name:'童装鞋'},{path:'/kids/jeans',name:'童装牛仔裤'},{path:'/kids/shirts',name:'童装衬衫'},{path:'/kids/shoes/:id',name:'童装鞋细节'},
groupedRoutes=routes.reduce(函数(r,{path,name}){
路径
.split(/(?=\/)/)
.减少((a,i,p)=>{
var path=p.slice(0,i+1).join(“”),
item=a.find(q=>q.path==path);
if(!item)a.push(item={path,name,children:[]});
返回项。子项;
},r);
返回r;
}, []);
console.log(groupedRoutes);

.as控制台包装{max height:100%!important;top:0;}
使用数组作为结果集可能对您有效

const
routes=[{path:'/',name:'home'},{path:'/about',name:'about'},{path:'/mens',name:'男装部分'},{path:'/mens/shoes',name:'男装鞋'},{path:'/mens/shoes/:id',name:'男装鞋细节'},{path:'/kids',name:'童装部分'},{path:'/kids/shoes',name:'童装鞋'},{path:'/kids/jeans',name:'童装牛仔裤'},{path:'/kids/shirts',name:'童装衬衫'},{path:'/kids/shoes/:id',name:'童装鞋细节'},
groupedRoutes=routes.reduce(函数(r,{path,name}){
路径
.split(/(?=\/)/)
.减少((a,i,p)=>{
var path=p.slice(0,i+1).join(“”),
item=a.find(q=>q.path==path);
if(!item)a.push(item={path,name,children:[]});
返回项。子项;
},r);
返回r;
}, []);
console.log(groupedRoutes);


.as控制台包装{最大高度:100%!重要;顶部:0;}
主目录是什么?所有目录都应该是主目录的子目录吗?@NinaScholz谢谢你提醒我,我忘了在最初的帖子中写它。更新了我的问题:)顺便说一句,你的结果混合了带有子路径名的对象样式和带有对象的子数组。子目录的子目录会发生什么情况children?请将想要的结果添加到给定的数据中。@NinaScholz第二个children可以在父项下是平坦的,
parent>children
“/children:[{}]的数组
需要输入你的结果吗?主目录是什么?所有目录都应该是主目录的子目录吗?@NinaScholz谢谢你提醒我,我忘了在最初的帖子中写它。更新了我的问题:)顺便说一句,你的结果混合了带有子路径名的对象和带有对象的子数组。发生了什么给孩子们的孩子们添加什么?请将想要的结果添加到给定的数据中。@NinaScholz第二个孩子可以是平的在父母之下,
parent>children
“/children”的数组:[{}]
需要加入到你的结果中吗?我的直觉告诉我,除了
“/”
之外的所有东西都应该是
“/”的直接(或间接)孩子。”
我并不是说你的答案是错误的。我只是觉得OP没有很好地考虑到这一点…@user633183我有,对于我的特殊用途,这是我需要的结构。回家路线不是所有孩子的父母,它是独立的。它只是碰巧是第一条路线,因此
/
,可能是
/home
@Dejan.s the结构是不一致的,因此任何处理它的程序都必须处理不一致性。也许这不是你的选择,但实际上是错误的。一个定义良好的一致性结构总是更好。我会尝试一下。我很好奇,在第二个reduce
reduce((o,u,I,p)
这里的参数代表什么?我的直觉告诉我除了
“/”
之外的所有东西都应该是
“/”
的直接(或间接)子对象。我不是sa