-
逻辑分析:封装一个函数,在函数中自己调用自己,是递归的技术特点,而想要把数组类型数据转化成树形数据,还需要从数据入手,一般后台给到的数组数据中会给到根结点和子节点的判断标识
-
数据分析:一般拿到的数据会类似如下代码这种数组,其中每个对象中都有id和pid两种属性,简单理解,如果一个对象中的pid和某个对象中的id相同,那么所有pid等于id的对象都可以作为这个id对象下的分支,当然也需要处理成数组的方式展现
-
平铺数组代码
const arr = [
{ id: 1, name: "部门1", pid: 0 }, // 根节点
{ id: 2, name: "部门2", pid: 1 },
{ id: 3, name: "部门3", pid: 1 },
{ id: 4, name: "部门4", pid: 3 },
{ id: 5, name: "部门5", pid: 4 },
];
- 转化后的树形代码:可以看到pid为1的对象都放在了一个children数组中,children数组又在id为1的数组当中,这样久形成了一个属性结构,而children数组中的对象id也有2和3,他们同样也可以找数据中对于pid等于2和3的对象作为他们的分支
- 完整代码:
const arr = [
{ id: 1, name: "部门1", pid: 0 }, // 根节点
{ id: 2, name: "部门2", pid: 1 },
{ id: 3, name: "部门3", pid: 1 },
{ id: 4, name: "部门4", pid: 3 },
{ id: 5, name: "部门5", pid: 4 },
];
function toTree(arr,id){
let res = []
arr.forEach(item => {
if(item.pid === id) {
//要去找item的子级,item.id == 子级的pid
//如果找到了对应的子级item久把它push到数组当中
res.push(item)
//child数组标识找到了几个子分支
const child = toTree(arr,item.id)
//表示找到了子分支
if(child.length){
item.child = child
}
}
})
return res
}
console.log(toTree(arr,0));