• 复杂JSON对象的查询与合并


    一个表里存放了全国各地地区、省、市、县区的数据,为了提高加载速度我保存成了本地的JSON文件

    结构大致如下:

    [{
        "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文件进行查询,先查出这个管理员所管理的区域节点ID,遍历生成每个ID所在的节点树,最终将这些树合并。

    下面是代码

            $(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;
        }

    运行结果

     

  • 相关阅读:
    trie树
    单调队列
    网络流24题——试题库问题
    费用流的简单应用
    Manacher算法
    KMP算法
    网络流之最小费用最大流
    网络流之二分图匹配【转】
    网络流之最大流
    矩阵快速幂优化菲波那切数列
  • 原文地址:https://www.cnblogs.com/yaotome/p/9513294.html
Copyright © 2020-2023  润新知