原始数据:
其中省略很多字段
const nodes = [
{OrganizeID:'2',ParentID:'0',name:'水果'},
{OrganizeID:'201',ParentID:'2',name:'瓜类'},
{OrganizeID:'202',ParentID:'2',name:'果类'},
{OrganizeID:'20101',ParentID:'201',name:'西瓜'},
{OrganizeID:'20202',ParentID:'202',name:'苹果'},
{OrganizeID:'2020201',ParentID:'20202',name:'苹果-1'},
{OrganizeID:'2020202',ParentID:'20202',name:'苹果-2'},
]
我的尝试:
nodes.forEach(o = >{
const item = leve1.find(({
OrganizeID
}) = >{
return OrganizeID == o.ParentID
}) if (item) {
if (item.children) {
item.children.push(o)
} else {
item["children"] = [o]
}
}
})
我想要的:
[
{
label:"瓜类",
value:"201",
children:[
{value:'20101',,label:'西瓜',...},
],
...
},
{
label:"果类",
value:"202",
children:[
{value:'20202',,label:'苹果',children:[
....
]
},
],
...
}
]
label,value,children是必须的,省略了很多字段
非常感谢您的帮助~
这个问题信息中其实有冗余信息,因为
OrganizeID
信息中已经包含了层级信息,如果原始数组以OrganizeID
的长度排序过,则可以一次性的遍历构建出需求的树。这是基于:
OrganizeID
长度为1 的是根节点OrganizeID
长度为7 的为最末端页节点OrganizeID
中间长度的 可能是末端页节点,也可能是有子节点的节点(分枝节点)OrganizeID
为1位外(不存在父节点啦),其他节点的父节点的OrganizeID
(临时标记为PID)可以依据当前节点的OrganizeID
(临时标记为CID)计算出来,其计算公式为PID=CID.substr(0,CID.length-2)
,而且可以依次递归查找到根(OrganizeID
为1位的情况),这样因为父节点肯定已经建立,所以可以直接插入。不过题主要
children
属性为数组,其实在这里不够合理,如果还是Object属性,其实更方便查询使用,否则还需要对数组进行遍历查找。一个参考实现: