美文网首页
JavaScript - 递归:将平级结构转为树状结构

JavaScript - 递归:将平级结构转为树状结构

作者: 金药 | 来源:发表于2023-02-22 15:14 被阅读0次

    原始数据

            let oldArr = [
                { id: '1000', pid: null, name: '西安总部' }, // 1级
                { id: '10001', pid: '1000', name: '西安雁塔分部 - 子公司' }, // 2级
                { id: '10002', pid: '1000', name: '西安莲湖分部 - 子公司' }, // 2级
                { id: '100021', pid: '10002', name: '西安莲湖分部 - 西桃园分部 - 子公司' }, // 3级
                { id: '2000', pid: null, name: '北京总部' }, // 1级
                { id: '20001', pid: '2000', name: '北京丰台分部 - 子公司' }, // 2级
                { id: '20002', pid: '2000', name: '北京朝阳分部 - 子公司' }, // 2级
                { id: '200021', pid: '20002', name: '北京朝阳分部 - 广渠路分部 - 子公司' } // 3级
            ]
    

    需要转化的样子


    image.png
     <div>{this.gongsi()}</div>
    
        gongsi = () => {
            let oldArr = [
                { id: '1000', pid: null, name: '西安总部' }, // 1级
                { id: '10001', pid: '1000', name: '西安雁塔分部 - 子公司' }, // 2级
                { id: '10002', pid: '1000', name: '西安莲湖分部 - 子公司' }, // 2级
                { id: '100021', pid: '10002', name: '西安莲湖分部 - 西桃园分部 - 子公司' }, // 3级
                { id: '2000', pid: null, name: '北京总部' }, // 1级
                { id: '20001', pid: '2000', name: '北京丰台分部 - 子公司' }, // 2级
                { id: '20002', pid: '2000', name: '北京朝阳分部 - 子公司' }, // 2级
                { id: '200021', pid: '20002', name: '北京朝阳分部 - 广渠路分部 - 子公司' } // 3级
            ]
            let newArr = []
            this.treeS(oldArr,null,newArr)
        }
    
        treeS = (oldArr,id,newArr) => {
            oldArr.forEach((i)=>{
                if(i.pid == id) { newArr.push(i)}
            })
            console.log(newArr,'一级');
            newArr.forEach((item)=> {
                item.children = []
                console.log(newArr,'newArr');
                this.treeS(oldArr,item.id, item.children)
            })
            console.log(newArr,'后面级别');
        }
    

    1.第一步遍历老数组将一级节点先筛选出来得到一个新数组
    2.第二步给新数组遍历加children,进行递归
    (第一次调用递归函数传老数组,id为null,新数组为空)
    (第二次调用递归函数传老数组,id为新数组每一个id,新数组为每一个新加的children项)
    (每次递归都会判断当前传入的id是不是和他上一级id一致,是就push进他传入的新数组)

    相关文章

      网友评论

          本文标题:JavaScript - 递归:将平级结构转为树状结构

          本文链接:https://www.haomeiwen.com/subject/mmyakdtx.html