复杂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;
}
运行结果



复杂JSON对象的查询与合并的更多相关文章
- SQLserver2016对字段是json对象查询
现在2016内置对json对象的查询支持了.正好项目中用到,做个备忘 如果字段内容是: [{"tagid":"100015","orderid&quo ...
- jQuery中的$.extend方法来扩展JSON对象及合并,方便调用对象方法
$.extend方法可以扩展JSON对象,用一个或多个其他对象来扩展一个对象,返回被扩展的对象. 例一 合并 settings 和 options,修改并返回 settings var setting ...
- 将具有关联关系的两个表从hibernate查询出来转成json对象时报错
第一篇文章: 相信大家做过JSON相关的东西对这个异常并不陌生,这个异常是由于JSONObject插件内部会无限拆解你传入的对象,直到没有可拆解为止,问题就在这,如果你传入的对象有外键关系,或者相互引 ...
- EFCore使用JSON_VALUE查询json对象的值
EFCore使用JSON_VALUE查询json对象的值 Intro SqlServer 从2016开始支持 JSON 操作,可以使用 JSON_VALUE 查询 JSON 对象的某个属性值,更多介绍 ...
- 序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询 多表关联查询
查询窗口中可以设置很多查询条件 表单中输入的内容转为datagrid的load方法所需的查询条件向原请求地址再次提出新的查询,将结果显示在datagrid中 转换方法看代码注释 <td cols ...
- 合并JSON对象的正确方式
一. 前言 “JSON对象合并”是前端开发和 NodeJS 环境开发中非常常见的操作.开发者通常会通过循环遍历或一些库封装的方法或 JavaScript ECMAScript 2015 定义的 Obj ...
- hive 将hive表数据查询出来转为json对象和json数组输出
一.将hive表数据查询出来转为json对象输出 1.将查询出来的数据转为一行一行,并指定分割符的数据 2.使用UDF函数,将每一行数据作为string传入UDF函数中转换为json再返回 1.准备数 ...
- mysql json 使用 类型 查询 函数
一,对记录的操作 1.创建有json字段的表 -- 创建表 ) , info JSON); 2.插入记录 -- 插入含有json数组的记录 , , "abc", NULL, TRU ...
- XE3随笔6:SuperObject 的 JSON 对象中还可以包含 "方法"
SuperObject 的 JSON 对象中还可以包含 "方法", 这太有意思了; 其方法的格式是: procedure Method(const This, Params: IS ...
随机推荐
- 阿里云CentOS7服务器利用LVM分区挂载磁盘全记录
1.进入服务器后,首先利用fdisk -l来观察磁盘信息,可以看出红线标注处,有两块硬盘信息,分别是40G和300G 2.同时你也可以观察到分区信息,40G的硬盘已经分了一个区vda1,大小(Bloc ...
- vivado源文件和仿真文件的建立
目的:做一个3输入,1输出模块:其中只要有2个输入为1则输出为1: 1.打开vivado创建一个工程 2.选择保存路径和名称 3.选择创建rtl文件且勾选下面的选项 4.选择芯片如xc7a35tift ...
- 总结,为什么要重写hashset的hashcode()和equals()?
看了非常多博客,怕自己忘记了,通俗易懂的总结如下 本人总结下: 重写前,比较地址,hashcode方法如果相等可能是同一个对象,所以再用equals再比内存地址 重写后,比较值,重写hashCode方 ...
- PAT 甲级 1035 Password (20 分)
1035 Password (20 分) To prepare for PAT, the judge sometimes has to generate random passwords for th ...
- Hbase常见错误解决方法
Hbase常见错误解决方法 原文转载至:https://www.jianshu.com/p/5fd74812c56c 我是通过maven管理的依赖,直接修改maven依赖中hbase的版本就可以了 ...
- Servlet-Context学习笔记
介绍 ServletContext其实就是全局作用域对象, 上下文环境对象 利用context可以实现对,当前网站中所有的Servlet共享数据 context对象只能由Tomcat负责创建,在tom ...
- 使用Git Bash从Git上下载代码到本地以及上传代码到码云Git
前提是在码云上已经新建一个空的项目,可参考:https://www.cnblogs.com/babysbreath/p/9170455.html 1.新建一个目录,存放下载下来的项目,我在D盘新建了一 ...
- adb相关指令 笔记
adb相关指令 笔记 1.adb devices 查看物理测试设备或模拟器的相关信息,有三个状态: (1)device 设备已连接到adb服务器上,但该状态并不代表设备已启动完毕可以进行操作: ( ...
- tomcat和iis共用80端口的简明手册
对于使用tomcat-connector实现iis与tomcat实现80端口共用的问题,网上的信息异常混乱,很多地方误人子弟,浪费时间.本文给出简明手册式的做法: 首先列出我们需要做的事项: 1. ...
- python pdfkit html转pdf响应式轮子 django例
pip install pdfkit 本例用django做的请求,换成对应框架即可 此方法可将html页面转成pdf下载 #!/usr/bin/env python # coding:utf-8 im ...