复杂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 ...
随机推荐
- TypeScript: this bind 和 回调的正确用法
TypeScript 中如果传递了 而且在回调函数中用了this 的话, 就要小心了, 这个this 不一定是指向当前类对象了,如果想确保指向的还是那个对象的话, 需要在传递那个方法的时候, 先调用b ...
- HttpURLConnection 传输数据和下载图片
一.传输字符串数据 在Android中HttpURLConnection传输数据是必不可少的,我们继续在“AsyncTask(异步任务)”案例的基础上添加. 案例: 首先我们做一个jsp的服务端,文件 ...
- DES加密算法—实现(C语言)
http://www.iteye.com/topic/478024 DES(Data Encrypt Standard数据库加密标准)是迄今为止使用最广泛的加密体制. 初学信息安全的新生,一般都会被老 ...
- Git常用的操作记录(自用)
分支常用操作命令 $ git branch -a //查看分支 $ git checkout -b dev origin/master //切换/创建分支 $ git branch -vv 或 gi ...
- selenium 目录结构解释
common目录 定义了通用的异常类 webdriver目录 android.backberry.chrome.edge.firefox.ie.opera.phantomjs.safa ...
- Intent之跳转总结
) { localIntent.setAction(; ActivityManager am = (ActivityManager) context.) {) { ) { // android 5.0 ...
- 我的es6笔记
变量 1. let 和 const 声明的变量不在window上了 2. es6中对于块级作用域里的函数声明实现不统一,要避免在大括号里声明函数,尽量用函数表达式来替代. 3. let和const声明 ...
- jupyter依赖tornado版本
使用jupyter莫名奇妙出现500错误,发现是更新tornado出了问题,我的jupyter版本是5.7.4不支持6.x版本的tornado,回退到5.x版本的tornado就好了. pip ins ...
- Windows下虚拟机安装Mac OS X —– VMware Workstation12安装Mac OS X 10.11
1下载 镜像:Instal OS X Yosemite 10.10.3(14D131).cdr 密码:qhhm 2 unlocker208文件(链接:https://pan.baidu ...
- POJ1083 Moving Tables
POJ1083 Moving Tables Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 35297 Accepted: ...