複雜JSON對象的查詢與合併

一個表裏存放了全國各地地區、省、市、縣區的數據,爲了提升加載速度我保存成了本地的JSON文件node

結構大體以下:ajax

[{
    "text": "中華人民共和國",
    "spid": "2013010535",
    "nodes": [{
        "text": "東北",
        "spid": "2013010535",
        "nodes": [{
            "text": "遼寧省",
            "spid": "2013035210",
            "nodes": [{
                "text": "瀋陽市",
                "spid": "2013035211",
                "nodes": [{
                    "text": "瀋陽市和平區",
                    "spid": "2013038441"
                }, {
                    "text": "瀋河區",
                    "spid": "2013038441"
                }, {
                    "text": "大東區",
                    "spid": "2013038441"
                }, {
                    "text": "皇姑區",
                    "spid": "2013038441"
                }, {
                    "text": "瀋陽市鐵西區",
                    "spid": "2013038441"
                }, {
                    "text": "甦家屯區",
                    "spid": "2013038441"
                }, {
                    "text": "東陵區",
                    "spid": "2013038441"
                }, {
                    "text": "沈北新區",
                    "spid": "2013038441"
                }, {
                    "text": "于洪區",
                    "spid": "2013038441"
                }, {
                    "text": "遼中縣",
                    "spid": "2013038441"
                }, {
                    "text": "康平縣",
                    "spid": "2013038441"
                }, {
                    "text": "法庫縣",
                    "spid": "2013038441"
                }, {
                    "text": "新民市",
                    "spid": "2013038441"
                }]
            }, {
                "text": "大連市",
                "spid": "2013035211",
                "nodes": [{
                    "text": "中山區",
                    "spid": "2013038441"
                }, {
                    "text": "西崗區",
                    "spid": "2013038441"
                }, {
                    "text": "沙河口區",
                    "spid": "2013038441"
                }, {
                    "text": "甘井子區",
                    "spid": "2013038441"
                }, {
                    "text": "旅順口區",
                    "spid": "2013038441"
                }, {
                    "text": "金州區",
                    "spid": "2013038441"
                }, {
                    "text": "長海縣",
                    "spid": "2013038441"
                }, {
                    "text": "瓦房店市",
                    "spid": "2013038441"
                }, {
                    "text": "普蘭店市",
                    "spid": "2013038441"
                }, {
                    "text": "莊河市",
                    "spid": "2013038441"
                }]
            }]
        }]
    }]
}]

因爲全國的地理信息數據太多,這裏只截取了一小部分json

加載這些JSON數據展示爲一棵樹後,咱們看到的是全國的行政區域信息async

每一個地區對應一個地區節點網站,網站加載了該地區的特點照片,父節點的網站要包含子節點的數據網站

系統管理員能夠爲每一個網站能夠分配管理員url

父節點的管理員同時也是子節點的管理員spa

分站管理員打開後臺管理界面時,能夠看到本身所管理的行政區域樹code

一個管理員能夠管理多個地區,一個地區能夠有多個管理員blog

這就要求對JSON文件進行查詢,先查出這個管理員所管理的區域節點ID,遍歷生成每一個ID所在的節點樹,最終將這些樹合併。string

下面是代碼

        $(function () {
            //加載行政區域樹數據
            $.ajax({
                url: './data/tree.json',
                dataType: 'text',
                async: true,
                type: 'GET',
                success: function (response) {                 
                    var json = $.parseJSON(response);
                    var result1 = up('133830', json);
                    console.log(result1);
                    var result2 = up('133695', json);
                    console.log(result2);
                    var result = merge([result1],[result2]);
                    console.log(result);
                }
            });
        });
        function up(nodeid, map) {
            var currentMap = null, tmp = JSON.parse(JSON.stringify(map));
            tmp.forEach(function (subMap) {
                if (subMap.nodeid === nodeid) currentMap = subMap;
            });
            if (currentMap !== null) {
                return currentMap;
            } else {
                var result = null;
                tmp.forEach(function (subMap) {
                    if (subMap.hasOwnProperty("nodes")) {
                        var subRe = up(nodeid, subMap.nodes);
                        if (subRe !== null) {subMap.nodes = subRe; result = subMap;}
                    }
                });
                return result;
            }
        }
        function merge (map1, map2) {
        var result = [], tmp1 = JSON.parse(JSON.stringify(map1)), tmp2 = JSON.parse(JSON.stringify(map2));
        tmp1.forEach(function (item1) {
            var flag = false;
            tmp2.forEach(function (item2) {
                if (item1.nodeid === item2.nodeid) {
                    flag = true;
                    result.push({
                        text: item1.text,
                        nodeid: item1.nodeid,
                        spid: item1.spid,
                        level: item1.level,
                        parentid: item1.parentid,
                        nodes: merge([item1.nodes], [item2.nodes])
                    });
                }
            });
            if (!flag) result.push(item1);
        });
        tmp2.forEach(function (item2) {
            var flag = false;
            tmp1.forEach(function (item1) {
                if (item1.nodeid === item2.nodeid) flag = true;
            });
            if (!flag) result.push(item2);
        });
        return result;
    }

運行結果

 

 

相關文章
相關標籤/搜索