随身笔记
随身笔记

js根据id递归获取节点

 var array = [
     {
         id: 1,
         children:[{
             id:2,
             children:[]
         }]
     },

     {
         id:3,
         children:[]
     },

     {
         id:4,
         children:[
             {
                 id:5,
                 children:[
                     {
                         id:6,
                         children:[],
                         path:'aaa',
                     },

                     {
                         id:7,
                         path:'xxx',
                         children:[
                             {
                                 id:187,
                                 path:'zxxx',
                             }
                         ]
                     }
                 ]
             }
         ]
     }
 ]


//根据id找到对应的树节点
 var returnedItem
 var find = function(arr, id){

     for(let i=0;i<arr.length;i++){
         if( arr[i].id==id ){
             returnedItem = arr[i]
             break
         }else if(arr[i].children && arr[i].children.length > 0){
             find(arr[i].children, id);  //递归调用
         }
     }
     return  returnedItem

     // arr.forEach((item) => { //利用foreach循环遍历
     //     if(item.id==id)//判断递归结束条件
     //     {
     //         returnedItem = item;
     //         return item;
     //     }
     //     else if(item.children.length > 0) //判断chlidren是否有数据
     //     {
     //         find(item.children, id);  //递归调用
     //     }
     // })
 }

// var item = find(array, 187);
 console.log(find(array, 6))

 // 获取到
 // {
 //     id:6,
 //         children:[],
 //     path:'aaa',
 // },

 

 

 

//找到树中最大的id
var tempid=0
function findmaxValue(arr){

    for(let i=0;i<arr.length;i++){
        if(arr[i].id>tempid){
            tempid=arr[i].id
        }

        if(arr[i].children && arr[i].children.length > 0){
            findmaxValue(arr[i].children);
        }else{
            // break
        }

    }
    return tempid
}

findmaxValue(array)

 

 

//根据子节点,找到该子节点所有祖父的id
function treeFindPath(tree,func,path=[]){
    if(!tree)return[]
    for(const data of tree){

        //记得修改这里,你想要的字段
        path.push(data.id)
        if(func(data)) return path
        if(data.children){
            const findChildren=treeFindPath(data.children,func,path)
            if(findChildren.length)return findChildren
        }
        path.pop()
    }


    return[]
}

console.log(treeFindPath(array,data=>data['id']===187))
//[4, 5, 7, 187]

 

 

//根据子节点,向上找到该子节点整个祖父树
function findson_parents(vdata,key,value){
    function treeFindPath(tree,func,path=[]){
        if(!tree)return[]
        for(const data of tree){

            //记得修改这里,你想要的字段
            path.push({
                id:data.id,
                path:data.path,
                children:[]
            })
            if(func(data)) return path
            if(data.children){
                const findChildren=treeFindPath(data.children,func,path)
                if(findChildren.length)return findChildren
            }
            path.pop()
        }


        return[]
    }


    var temarry=treeFindPath(vdata,data=>data[key]===value)

    for(let i=0;i<temarry.length;i++){
        if( temarry[i+1] ){
            temarry[i].children.push(temarry[i+1])
        }

    }

    return temarry[0]
}

console.log(  findson_parents(array,'id',187) )

 

 

构建树

https://sdeno.com/wp-content/uploads/2020/04/jstress1.jpg
let source = [
    {id:1,parentId:0,name:"一级菜单A",rank:1},
    {id:2,parentId:0,name:"一级菜单B",rank:1},
    {id:3,parentId:0,name:"一级菜单C",rank:1},
    {id:4,parentId:1,name:"二级菜单A-A",rank:2},
    {id:5,parentId:1,name:"二级菜单A-B",rank:2},
    {id:6,parentId:2,name:"二级菜单B-A",rank:2},
    {id:7,parentId:4,name:"三级菜单A-A-A",rank:3},
    {id:8,parentId:7,name:"四级菜单A-A-A-A",rank:4},
    {id:9,parentId:8,name:"五级菜单A-A-A-A-A",rank:5},
    {id:10,parentId:9,name:"六级菜单A-A-A-A-A-A",rank:6},
    {id:11,parentId:10,name:"七级菜单A-A-A-A-A-A-A",rank:7},
    {id:12,parentId:11,name:"八级菜单A-A-A-A-A-A-A-A",rank:8},
    {id:13,parentId:12,name:"九级菜单A-A-A-A-A-A-A-A-A",rank:9},
    {id:14,parentId:13,name:"十级菜单A-A-A-A-A-A-A-A-A-A",rank:10},
];

function setTreeData(source){
    let cloneData = JSON.parse(JSON.stringify(source))      // 对源数据深度克隆
    return  cloneData.filter(father=>{                      // 循环所有项,并添加children属性
        let branchArr = cloneData.filter(child=>father.id == child.parentId);       // 返回每一项的子级数组
        branchArr.length>0 ? father.children=branchArr : ''   //给父级添加一个children属性,并赋值
        return father.parentId==0;      //返回第一层
    });
}
console.log(setTreeData(source),1111111)   // 树形数据

/* 封装函数 */
/* 字段名以字符串的形式传入 */
function treeData(source, id, parentId, children){
    let cloneData = JSON.parse(JSON.stringify(source))
    return cloneData.filter(father=>{
        let branchArr = cloneData.filter(child => father[id] == child[parentId]);
        branchArr.length>0 ? father[children] = branchArr : ''
        return father[parentId] == 0
    })
}
// 调用
console.log(treeData(source,'id','parentId','children'),22222222222)

 

 

 

 

//树转列表
let tree = [
    {
        id: 1,
        name: 'text1',
        parentId: 1,
        children: [
            {
                id: 2,
                name: 'text2',
                parentId: 1,
                children: [
                    {
                        id: 4,
                        name: 'text4',
                        parentId: 2
                    }
                ]
            },
            {
                id: 3,
                name: 'text3',
                parentId: 1
            }
        ]
    }
]
function untieTree(tree, children_key='children') {
    if(!!!tree || Object.prototype.toString.call(tree) !== '[object Array]' || tree.length<=0) return [];
    const temp = [];
    tree.forEach(item => {
        temp.push(item, ...untieTree(item[children_key], children_key))
    });
    return temp;
}

 

//搜集指定层级的所有数据

var data5 = [{
        i:'a1',
        children: [{
            i:'a2',
            children: [{
                i:'a3',
            }, {
                i:'a4',
            }]
        }, {
            i:'a5',
            children: [{
                i:'a6',
            }, {
                i:'a7',
            }]
        }]
    },
        {
            i:'a8',
            children: [
                {
                    i:'a9',
                },
                {
                    i:'a10',
                }
            ]
        }
    ];
    var a1 = []
    function dfs(list, level=1) {
        list.forEach(item => {
            item.level = level;
            if(item.children) dfs(item.children, level+1)
            if(item.level == 3){  //搜集第三级 的所有数据
                var tem = JSON.parse(JSON.stringify(item))
                delete tem.children
                a1.push(tem)
            }
        })
        return list;
    }
    dfs(data5)
    console.log(a1)

        [
            {
                "i": "a3",
                "level": 3
            },
            {
                "i": "a4",
                "level": 3
            },
            {
                "i": "a6",
                "level": 3
            },
            {
                "i": "a7",
                "level": 3
            }
        ]

 

//找到当前子节点的当前父节点

var arr0=
        {

            children:[
                {
                    "children": [
                        {
                            "children": [
                                {
                                    "children": [],
                                    "jgdm": "460202",
                                    "jglx": "3",
                                    "jgmc": "三亚医院"
                                },

                            ],
                            "jgdm": "460201",
                            "jglx": "2",
                            "jgmc": "海棠区"
                        },

                    ],
                    "jgdm": "460200",
                    "jglx": "1",
                    "jgmc": "三亚市"
                },

            ]
        }


    function findParentNode(data, id,attrName) {
        //设置结果
        let result;
        if (!data) {
            return;//如果data传空,直接返回
        }
        for (var i = 0; i < data.children.length; i++) {
            let item = data.children[i];
            if (item[attrName] == id) {
                result = data;
                return result; //这里是实际返回的值,你可以只返回当前对象,或者指定当前对象的某个字段。
            } else if (item.children && item.children.length > 0) {
                //如果有子集,则把子集作为参数重新执行本方法
                result = findParentNode(item, id,attrName);
                //关键,千万不要直接return本方法,不然即使没有返回值也会将返回return,导致最外层循环中断,直接返回undefined,要有返回值才return才对
                if (result) {
                    return result;
                }
            }
        }
        //如果执行循环中都没有return,则在此return
        return result;
    }


    var nodeEl = findParentNode(arr0, 460202,'jgdm');  //找到{"jgdm":460202}当前节点的父节点
    console.log(nodeEl)

 

 

//树一共有多少层级,并返回最先找到最小的节点

function getMaxFloor (treeData) {
     let max = 0
     let childrenObj = null
     function each (data, floor) {
         data.forEach(e => {
             // e.floor = floor //顺便附加层级
             if (floor > max) {
                 max = floor
                 childrenObj = e
             }

             if (e.children && e.children.length > 0) {
                 each(e.children, floor + 1)
             }
         })
     }
     each(treeData,1)
     return {max,childrenObj}
 }

 const treeData = [
     {
         title: 'parent 1',
         key: '0-0',
         children: [
             {
                 title: 'parent 1-0',
                 key: '0-0-0',
                 disabled: true,
                 children: [
                     {
                         title: 'leaf2222',
                         key: '0-0-0-0',
                         disableCheckbox: true,
                         children: [
                             {
                                 title: 'lea666',
                                 key: '0-0-0-5',
                                 disableCheckbox: true,
                                 children: [
                                     {
                                         title: 'lea6776',
                                         key: '0-0-0-5',
                                         disableCheckbox: true,
                                     },
                                 ],
                             },
                         ],
                     },
                 ],
             }
         ],
     }
 ];

 //调用以上封装好的方法
 const maxNum = getMaxFloor(treeData)
 console.log(maxNum)

 

 

 

 

 

 

随身笔记

js根据id递归获取节点
var array = [ { id: 1, children:[{ id:2, children:[] }] }, { id:3, children:…
扫描二维码继续阅读
2020-04-30