• JSON树形格式从子级获取所有父级ID


    elementUI中的Cascader级联选择器组件,在指定选择项时,它需要一个数组值,如:[爷爷, 爸爸, 自己],然后进行v-model绑定这个数组

     

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8"/>
        <title>Document</title>
    </head>
    <body>
    <pre>
        // 结构:
    // 
    //   1 --- 3
    //     --- 4 --- 5 --- 6
    //                 --- 8
    //     --- 7
    //     --- 12 --- 13
    //   2 --- 9 --- 10
    //   11
    // 获取节点以及节点的父级关系
    // 0 1
    // 1 3
    // 1 4
    // 2 5
    // 3 6
    // 3 8
    // 1 7
    // 1 12
    // 2 13
    // 0 2
    // 1 9
    // 2 10
    // 0 11
    </pre>
        <input type="number" id="input">
        <a href="javascript:;" onclick="getArr()">获取</a>
        <div id="result">结果:</div>
    <script>
    // js 获取树形深度关系数组
    // 树形数据如下例中的treeData,
    // 希望有如下结果:
    // console.log(getTreeDeepArr(1, treeData)); // [1]
    // console.log(getTreeDeepArr(3, treeData)); // [1, 3]
    // console.log(getTreeDeepArr(5, treeData)); // [1, 4, 5]
    var treeData = [{
        id: 1,
        children: [{
            id: 3
        },{
            id: 4,
            children: [{
                id: 5,
                children: [{
                    id: 6
                },
                {
                    id: 8
                }]
            }]
        },{
            id: 7
        },{
            id: 12,
            children: [{
                id: 13
            }]
        }]
    },{
        id: 2,
        children: [{
            id: 9,
            children: [{
                id: 10
            }]
        }]
    },{
        id: 11
    }];
    
    // 结构:
    // 
    //   1 --- 3
    //     --- 4 --- 5 --- 6
    //                 --- 8
    //     --- 7
    //   2 --- 9 --- 10
    //   11
    // 获取节点以及节点的父级关系
    // 0 1
    // 1 3
    // 1 4
    // 2 5
    // 3 6
    // 3 8
    // 1 7
    // 0 2
    // 1 9
    // 2 10
    // 0 11
    function getTreeDeepArr(key, treeData) {
    
        let arr = []; // 在递归时操作的数组
        let returnArr = []; // 存放结果的数组
        let depth = 0; // 定义全局层级
        // 定义递归函数
        function childrenEach(childrenData, depthN) {
    
            for (var j = 0; j < childrenData.length; j++) {
    
                depth = depthN; // 将执行的层级赋值 到 全局层级
    
                arr[depthN] = (childrenData[j].id);
                
                if (childrenData[j].id == key) {
    
                    // returnArr = arr; // 原写法不行, 因 此赋值存在指针关系
                    returnArr = arr.slice(0, depthN+1); //将目前匹配的数组,截断并保存到结果数组,
                    break
    
                } else {
    
                    if (childrenData[j].children) {
    
                        depth ++;
                        childrenEach(childrenData[j].children, depth);
    
                    }
                }
    
            }
            return returnArr;
        }
        return childrenEach(treeData, depth);
    }
    
    function getArr() {
        var _input = document.getElementById('input').value;
        
        console.log(getTreeDeepArr(_input, treeData).join(','))
        document.getElementById('result').innerHTML = '结果:' + getTreeDeepArr(_input, treeData).join(',');
    }
    console.log(getTreeDeepArr(7, treeData));
    
    </script>
    </body>
    </html>

    核心代码如下

    function getTreeDeepArr(key, treeData) {
    
        let arr = []; // 在递归时操作的数组
        let returnArr = []; // 存放结果的数组
        let depth = 0; // 定义全局层级
        // 定义递归函数
        function childrenEach(childrenData, depthN) {
    
            for (var j = 0; j < childrenData.length; j++) {
    
                depth = depthN; // 将执行的层级赋值 到 全局层级
    
                arr[depthN] = (childrenData[j].id);
                
                if (childrenData[j].id == key) {
    
                    // returnArr = arr; // 原写法不行, 因 此赋值存在指针关系
                    returnArr = arr.slice(0, depthN+1); //将目前匹配的数组,截断并保存到结果数组,
                    break
    
                } else {
    
                    if (childrenData[j].children) {
    
                        depth ++;
                        childrenEach(childrenData[j].children, depth);
    
                    }
                }
    
            }
            return returnArr;
        }
        return childrenEach(treeData, depth);
    }

    转自:https://segmentfault.com/a/1190000014827485

  • 相关阅读:
    js 隐藏、显示html 标签内容
    Elasticsearch第二章:Elasticsearch6.4.2破解xpack白金认证,以及kibana登录
    Elasticsearch第一章: 安装elasticsearch和kibana
    spring springboot2 结合 websocket+sockJs+stomp 实现个人订阅和广播模式
    MongoDB 查询重复手机号数量
    esxi直通sata控制器给群辉。群辉无法识别全部盘符,无法读取smart
    esxi直通显卡之后 游戏无法打开
    esxi硬盘直通,RDM
    SpringSecurity整合SpringSession-Redis 限制用户登录,SpringSecurity单用户登录
    Spring Security流程解释与配置
  • 原文地址:https://www.cnblogs.com/aipeli/p/12273607.html
Copyright © 2020-2023  润新知