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>

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM