递归方法处理数组数据转树形数据

193 阅读2分钟
  • 逻辑分析:封装一个函数,在函数中自己调用自己,是递归的技术特点,而想要把数组类型数据转化成树形数据,还需要从数据入手,一般后台给到的数组数据中会给到根结点和子节点的判断标识

  • 数据分析:一般拿到的数据会类似如下代码这种数组,其中每个对象中都有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的对象作为他们的分支

WechatIMG558.jpeg

  • 完整代码:
  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));