zoukankan      html  css  js  c++  java
  • json 根据某个子,寻找父节点的算法

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <title>json-query</title>
        <script type="text/javascript">
        var json = [{"value":"1","text":"中国","pid":"0","children":[{"value":"2","text":"山东省","pid":"1","children":[{"value":"3","text":"济南市","pid":"2","children":[{"value":"4","text":"历城区","pid":"3","children":[]},{"value":"5","text":"历下区","pid":"3","children":[]},{"value":"6","text":"高新区","pid":"3","children":[{"value":"fe8de48f20e54590bf60a83c4485a650","text":"南白花","pid":"6","children":[]},{"value":"4ac6d79609b5496f9296614ef4166ac7","text":"北白花","pid":"6","children":[]}]}]}]}]}]
        </script>
    
        <script type="text/javascript">
        /**
         * 递归查询JSON树 父子节点
         */
        var parentNode = null;
        var node = null;
    
        /**
         * 根据text查找当前节点以及父节点
         */
        function getNode(json, text) { 
    
            //1.第一层 root 深度遍历整个JSON
            for (var i = 0; i < json.length; i++) {
                if (node) {
                    break;
                }
                var obj = json[i];
                //没有就下一个
                if (!obj || !obj.text) {
                    continue;
                }
    
                //2.有节点就开始找,一直递归下去
                if (obj.text == text) {
                    //找到了与text匹配的节点,结束递归
                    node = obj;
                    break;
                } else {
                    //3.如果有子节点就开始找
                    if (obj.children&&obj.children.length!=0) {
                        //4.递归前,记录当前节点,作为parent 父亲
                        parentNode = obj;
                        //递归往下找
                        getNode(obj.children, text);
                    } else {
                        //跳出当前递归,返回上层递归
                        continue;
                    }
                }
            }
    
            //5.如果木有找到父节点,置为null,因为没有父亲  
            if (!node) {
                parentNode = null;
            }
    
            //6.返回结果obj
            return {
                parentNode: parentNode,
                node: node
            };
        }
    
        //批量查询
        var query = '南白花';
        var result = [];
        var getResult = function(json,query){
            node = null;
            parentNode = null;
            var obj = getNode(json, query);
            //判断是否闭包
            if(obj.parentNode){
                //有父节点
                console.log("查询text:" + query + ", 结果:" + obj.node.text + " -> 父级:" + (obj.parentNode ? obj.parentNode.text : '木有父级!'));
                //获取父节点text继续查祖节点
                getResult(json,obj.parentNode.text);
                result.push(obj.parentNode.text);
            }
            return result;
        }
        getResult(json,query);
        //最后将查询push到result中
        result.push(query);
        console.log(result);//['中国','山东省','济南市','高新区','南白花']
        </script>
    </head>
    
    <body>
    </body>
    
    </html>
    

      

  • 相关阅读:
    Oracle 常用的单行函数
    mysql练习02
    mysql练习
    Linux命令
    JSS
    CSS
    Html标签
    需求文档
    Oracle 常用的单行函数
    RHEL7最小化安装之后(桥接模式),查看本机IP,
  • 原文地址:https://www.cnblogs.com/wqing/p/12547212.html
Copyright © 2011-2022 走看看