经常会用到数组转树结构的方法,今天仔细写了一下,记录一下
// 定义对象
var arrsObj=[
{name:"一级标题1",id:1,parentId:0},
{name:"二级标题2",id:2,parentId:1},
{name:"三级标题1-1",id:3,parentId:2},
{name:"二级标题1-2",id:4,parentId:2},
{name:"三级标题2-1",id:5,parentId:3},
{name:"三级标题2-2",id:6,parentId:4}
]
//递归调用函数
function trans(parents,childs){
// 循环父级数组
parents.forEach((parent)=>{
// 循环子集数组
childs.forEach((child,index)=>{
// 如果子的父id和当前父循环id相同执行
if(child.parentId===parent.id){
// 深拷贝一份子列表
let tArrs = JSON.parse(JSON.stringify(childs))
// 删除子列表中的当前节点
tArrs.splice(index,1)
// 递归调用当前函数
trans([child],tArrs)
// 子对象挂到父级下面(引用类型可以直接改传过来的对象)
parent.childs?parent.childs.push(child):parent.childs = [child]
}
})
})
}
//入口函数
function transArrToTree(arrs){
console.log(JSON.stringify(arrs))
// 获取父级节点,一个或多个
let parents = arrs.filter((ele)=>{
return ele.parentId===0
})
// 获取除父级节点的所有节点
let childsFirst = arrs.filter((ele)=>{
return ele.parentId!==0
})
// 调用递归函数
trans(parents,childsFirst)
// 打印转化后的结果
console.log(JSON.stringify(parents))
}
// 调用转化函数
transArrToTree(arrsObj)