股墓山庄

专注于AS3,JavaScript 每天一点进步,坚持...
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

json 根据某个子,寻找父节点的算法

Posted on 2020-03-22 17:36  股墓山庄庄主  阅读(985)  评论(0编辑  收藏  举报
<!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>