关键词:
已知一个多层嵌套的json,取出所有父元素和子元素的id值
思路:因为不知道到底嵌套了多少层,递归有可能造成栈溢出、查询时间特别久的问题
所以先查询一次,判断是否有子节点,如果有,取出子节点并到父节点上,并动态更改数据长度,这样无限循环处理json取出所有id
menuIdInit () { var _this = this; var _menu = _this.menus; var menuId = []; var len = _menu.length; for(var i = 0; i < len; i++){ var item = _menu[i] ; if(item.child && item.child.length != 0){ var child = item.child ; for(var j = 0; j < child.length; j++){ _menu[len + j] = child[j] ; } len = _menu.length ; } menuId.push(item.id); } this.menusTree = menuId ; },
已知子节点id取出所有父节点id的方法
思路和上面的一样,不过更复杂了一点
一个N层嵌套的json
1。先遍历json数据,做处理,取出所有children节点并到原始数据上并给了新属性parentNode,它的值是所有他的上一级的父节点id
2。遍历查询id,只需要查询最外面一层的id就是所有子节点和父节点的id属性了
3。获取值
//json的处理 function searchInit(json) { var newJson = json.concat([]); var len = newJson.length; //长度 var parentNode = []; console.log(‘newJson‘, newJson); for (var i = 0; i < len; i++) { var item = newJson[i]; if (item.children && item.children.length != 0) { var child = item.children; for (var j = 0; j < child.length; j++) { if (item.parentNode) { child[j].parentNode = item.parentNode.concat([item.id]); } else { child[j].parentNode = [item.id] } console.log(item.parentNode, item.id); newJson[len + j] = child[j]; } len = newJson.length; } } return newJson; } //搜索当前权限,获得所有父级权限id function searchTree(json, id) { console.log("tree",json); var newJson = json.concat([]); var len = newJson.length; //长度 console.log("json",len); var parentNode = []; //查找id for (var s = 0; s < len; s++) { if (newJson[s].id == id) { if (newJson[s].parentNode == null || newJson[s].parentNode.length == 0) { parentNode = []; } else { parentNode = newJson[s].parentNode; } } else { continue; } } return parentNode; } //获取最终所有权限列表id //json :最初的权限列表 //keys :用户点击获取Vue获取到的最底层权限id数组 function getKeys(json, keys) { var final = []; for (var i = 0; i < keys.length; i++) { var final = searchTree(json, keys[i]).concat(final); } if (json.length == 0 || keys.length == 0) { return []; } else { var c = $.unique((final.concat(keys)).sort()); return c; } }
JSON数据
{ "children": [ { "children": [ { "children": [ { "children": null, "name": "浏览", "id": 443, "label": "浏览", "open": true, "parentNode": [ 121, 232, 411 ] }, { "children": null, "name": "批量删除", "id": 420, "label": "批量删除", "open": true, "parentNode": [ 121, 232, 411 ] }, { "children": null, "name": "搜索", "id": 415, "label": "搜索", "open": true, "parentNode": [ 121, 232, 411 ] }, { "children": null, "name": "删除", "id": 414, "label": "删除", "open": true, "parentNode": [ 121, 232, 411 ] }, { "children": null, "name": "编辑", "id": 413, "label": "编辑", "open": true, "parentNode": [ 121, 232, 411 ] }, { "children": null, "name": "新增", "id": 412, "label": "新增", "open": true, "parentNode": [ 121, 232, 411 ] } ], "name": "芯片备案", "id": 411, "label": "芯片备案", "open": true, "parentNode": [ 121, 232 ] }, { "children": [ { "children": null, "name": "编辑", "id": 403, "label": "编辑", "open": true, "parentNode": [ 121, 232, 401 ] }, { "children": null, "name": "新增", "id": 402, "label": "新增", "open": true, "parentNode": [ 121, 232, 401 ] } ], "name": "软件版本管理", "id": 401, "label": "软件版本管理", "open": true, "parentNode": [ 121, 232 ] }, { "children": [ { "children": [ { "children": null, "name": "浏览", "id": 442, "label": "浏览", "open": true, "parentNode": [ 121, 232, 241, 371 ] }, { "children": null, "name": "删除", "id": 374, "label": "删除", "open": true, "parentNode": [ 121, 232, 241, 371 ] }, { "children": null, "name": "编辑", "id": 373, "label": "编辑", "open": true, "parentNode": [ 121, 232, 241, 371 ] }, { "children": null, "name": "新增", "id": 372, "label": "新增", "open": true, "parentNode": [ 121, 232, 241, 371 ] } ], "name": "内容源支持项管理", "id": 371, "label": "内容源支持项管理", "open": true, "parentNode": [ 121, 232, 241 ] }, { "children": [ { "children": [ { "children": null, "name": "浏览", "id": 441, "label": "浏览", "open": true, "parentNode": [ 121, 232, 241, 311, 351 ] }, { "children": null, "name": "删除", "id": 354, "label": "删除", "open": true, "parentNode": [ 121, 232, 241, 311, 351 ] }, { "children": null, "name": "编辑", "id": 353, "label": "编辑", "open": true, "parentNode": [ 121, 232, 241, 311, 351 ] }, { "children": null, "name": "新增", "id": 352, "label": "新增", "open": true, "parentNode": [ 121, 232, 241, 311, 351 ] } ], "name": "一体机管理", "id": 351, "label": "一体机管理", "open": true, "parentNode": [ 121, 232, 241, 311 ] }, { "children": [ { "children": null, "name": "浏览", "id": 440, "label": "浏览", "open": true, "parentNode": [ 121, 232, 241, 311, 341 ] }, { "children": null, "name": "删除", "id": 344, "label": "删除", "open": true, "parentNode": [ 121, 232, 241, 311, 341 ] }, { "children": null, "name": "编辑", "id": 343, "label": "编辑", "open": true, "parentNode": [ 121, 232, 241, 311, 341 ] }, { "children": null, "name": "新增", "id": 342, "label": "新增", "open": true, "parentNode": [ 121, 232, 241, 311, 341 ] } ], "name": "遥控器管理", "id": 341, "label": "遥控器管理", "open": true, "parentNode": [ 121, 232, 241, 311 ] }, { "children": [ { "children": null, "name": "浏览", "id": 439, "label": "浏览", "open": true, "parentNode": [ 121, 232, 241, 311, 331 ] }, { "children": null, "name": "删除", "id": 334, "label": "删除", "open": true, "parentNode": [ 121, 232, 241, 311, 331 ] }, { "children": null, "name": "编辑", "id": 333, "label": "编辑", "open": true, "parentNode": [ 121, 232, 241, 311, 331 ] }, { "children": null, "name": "新增", "id": 332, "label": "新增", "open": true, "parentNode": [ 121, 232, 241, 311, 331 ] } ], "name": "蓝牙管理", "id": 331, "label": "蓝牙管理", "open": true, "parentNode": [ 121, 232, 241, 311 ] }, { "children": [ { "children": null, "name": "浏览", "id": 438, "label": "浏览", "open": true, "parentNode": [ 121, 232, 241, 311, 321 ] }, { "children": null, "name": "删除", "id": 324, "label": "删除", "open": true, "parentNode": [ 121, 232, 241, 311, 321 ] }, { "children": null, "name": "编辑", "id": 323, "label": "编辑", "open": true, "parentNode": [ 121, 232, 241, 311, 321 ] }, { "children": null, "name": "新增", "id": 322, "label": "新增", "open": true, "parentNode": [ 121, 232, 241, 311, 321 ] } ], "name": "Wi-Fi管理", "id": 321, "label": "Wi-Fi管理", "open": true, "parentNode": [ 121, 232, 241, 311 ] } ], "name": "硬件型号管理", "id": 311, "label": "硬件型号管理", "open": true, "parentNode": [ 121, 232, 241 ] }, { "children": [ { "children": [ { "children": null, "name": "浏览", "id": 437, "label": "浏览", "open": true, "parentNode": [ 121, 232, 241, 291, 296 ] }, { "children": null, "name": "删除", "id": 299, "label": "删除", "open": true, "parentNode": [ 121, 232, 241, 291, 296 ] }, { "children": null, "name": "编辑", "id": 298, "label": "编辑", "open": true, "parentNode": [ 121, 232, 241, 291, 296 ] }, { "children": null, "name": "新增", "id": 297, "label": "新增", "open": true, "parentNode": [ 121, 232, 241, 291, 296 ] } ], "name": "RAM", "id": 296, "label": "RAM", "open": true, "parentNode": [ 121, 232, 241, 291 ] }, { "children": [ { "children": null, "name": "浏览", "id": 436, "label": "浏览", "open": true, "parentNode": [ 121, 232, 241, 291, 292 ] }, { "children": null, "name": "删除", "id": 295, "label": "删除", "open": true, "parentNode": [ 121, 232, 241, 291, 292 ] }, { "children": null, "name": "编辑", "id": 294, "label": "编辑", "open": true, "parentNode": [ 121, 232, 241, 291, 292 ] }, { "children": null, "name": "新增", "id": 293, "label": "新增", "open": true, "parentNode": [ 121, 232, 241, 291, 292 ] } ], "name": "EMMC", "id": 292, "label": "EMMC", "open": true, "parentNode": [ 121, 232, 241, 291 ] } ], "name": "储存选项管理", "id": 291, "label": "储存选项管理", "open": true, "parentNode": [ 121, 232, 241 ] }, { "children": [ { "children": null, "name": "新增", "id": 282, "label": "新增", "open": true, "parentNode": [ 121, 232, 241, 281 ] } ], "name": "屏幕尺寸管理", "id": 281, "label": "屏幕尺寸管理", "open": true, "parentNode": [ 121, 232, 241 ] }, { "children": [ { "children": null, "name": "新增", "id": 272, "label": "新增", "open": true, "parentNode": [ 121, 232, 241, 271 ] } ], "name": "Android版本管理", "id": 271, "label": "Android版本管理", "open": true, "parentNode": [ 121, 232, 241 ] }, { "children": [ { "children": null, "name": "删除", "id": 264, "label": "删除", "open": true, "parentNode": [ 121, 232, 241, 261 ] }, { "children": null, "name": "编辑", "id": 263, "label": "编辑", "open": true, "parentNode": [ 121, 232, 241, 261 ] }, { "children": null, "name": "新增", "id": 262, "label": "新增", "open": true, "parentNode": [ 121, 232, 241, 261 ] } ], "name": "品牌管理", "id": 261, "label": "品牌管理", "open": true, "parentNode": [ 121, 232, 241 ] }, { "children": [ { "children": null, "name": "删除", "id": 254, "label": "删除", "open": true, "parentNode": [ 121, 232, 241, 251 ] }, { "children": null, "name": "编辑", "id": 253, "label": "编辑", "open": true, "parentNode": [ 121, 232, 241, 251 ] }, { "children": null, "name": "新增", "id": 252, "label": "新增", "open": true, "parentNode": [ 121, 232, 241, 251 ] } ], "name": "内容商管理", "id": 251, "label": "内容商管理", "open": true, "parentNode": [ 121, 232, 241 ] } ], "name": "机型属性配置", "id": 241, "label": "机型属性配置", "open": true, "parentNode": [ 121, 232 ] } ], "name": "基础数据管理", "id": 232, "label": "基础数据管理", "open": true, "parentNode": [ 121 ] }, { "children": [ { "children": null, "name": "新增", "id": 142, "label": "新增", "open": true, "parentNode": [ 121, 141 ] } ], "name": "机型备案", "id": 141, "label": "机型备案", "open": true, "parentNode": [ 121 ] }, { "children": null, "name": "报备管理", "id": 131, "label": "报备管理", "open": true, "parentNode": [ 121 ] } ], "name": "设备管理", "id": 121, "label": "设备管理", "open": true }
java怎么解析多层嵌套的json得到每个元素
用Jackson我只会做后面的数组部分"result":"cases":"page":1,"pagesize":10,"totalrows":11,"pages":2,"sort":"-createtime","results":["Id":111111,"No":null,"Name":"case1... 查看详情
iframe多层嵌套时获取元素
一、同域:1、父页面获取子页面元素:注意:onload事件jQuery获取:$("iframe").contents().find("holder")......;(嵌套三层,或者更多时)$(‘iframe‘).contents().find(‘iframe‘).contents().find("iframe")......js获取:window.frames["holder"].contentW 查看详情
如何用python解析多层嵌套的json?
近期遇到用Python解析多层嵌套的JSON的困难,通过json.loads转为dict类型后,使用dict['key']来调取value,会提示TypeError:stringindicesmustbeintegersJSON文件如链接:https://api.doctorxiong.club/v1/fund?code=010300,009683,006355,006697JSON的第二层是个二... 查看详情
ios模型多层嵌套模型用mjextension怎么解析
参考技术A你可以把json里模型对应的数组当做key来解析,MJExtension里提供了两个方法来帮助你解析在模型里嵌套的模型。首先,你需要在模型里面定义一个数组属性和一个需要存放的模型属性,如下:@property(nonatomic,strong)NSMutableArra... 查看详情
springbootfastjson解析多层嵌套复杂json字符串(代码片段)
1[]中括号代表的是一个数组;2大括号代表的是一个对象3双引号“”表示的是属性值4冒号:代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可以是基本数据类型,也可以是引用... 查看详情
pr嵌套效果只有一部分
...越大的素材卡顿感越严重。对于你这个使用场景,可以在嵌套之前先留出转场过渡需要的范围,嵌套后再剪到需要的时间点,就可以避免这种问题 参考技术B在css中,嵌套的效果只有一部分,也就是只有父元素的样式会影响子元... 查看详情
python之jsonpath模块
...sner.net/articles/JsonPathjsonpath表达式与xPath表达式类似,用来解析多层嵌套的json数据。JsonPath是Json版的XPath。JsonPath对于JSON来说,相当于XPath对于XMLJsonPath用符号$表示最外层对象,类似于Xpath中的根元素jsonPath可以用:例如,address.*表... 查看详情
js中如何优雅的使用多层嵌套属性而不会发生报错(代码片段)
平时在写js的时候遇到多层属性嵌套,一般大家敢直接用点使用吗?有没有开发的时候好好的,某一时刻突然出现一个控制台报错类似:UncaughtTypeError:xxxisnotafunction一般这种情况就是没有判断是否有值,如果数... 查看详情
java如何解析多层json数据
1.使用标准的Json对象,如org.json.JSONObjectjson=neworg.json.JSONObject(yourJsonString);然后通过get(keyString)逐个解析 2.构造一个类MyObject,根据你提出的问题,其中添加Stringname,List<MyObject>child,两个属性,增加gettersetter方法,通过com. 查看详情
解析嵌套的 Json 数据结构?
】解析嵌套的Json数据结构?【英文标题】:parsingnestedJsondatastructure?【发布时间】:2019-06-2805:04:07【问题描述】:我的JSON结构如下,我正在尝试使用它。我需要检索嵌套JSON数组图像的内容,但我并不完全知道这样做的正确方法... 查看详情
JSON.parse 嵌套 JSON 字符串属性解析
】JSON.parse嵌套JSON字符串属性解析【英文标题】:JSON.parsenestedJSONstringpropertyparsing【发布时间】:2019-03-3111:59:24【问题描述】:我从一个API模块得到以下字符串:"value":"\\"Id\\":\\"100\\",\\"OrganizationName\\":\\"[_+-:|;\'.\\\\\\/]ArizonaGrowerAuto... 查看详情
查询嵌套 JSON 数组 PostgreSQL 中的所有元素
】查询嵌套JSON数组PostgreSQL中的所有元素【英文标题】:QueryAllElementsinNestedJSONArrayPostrgreSQL【发布时间】:2020-12-1003:07:26【问题描述】:我正在尝试在SQL中创建一个查询来检索DNS答案信息,以便我可以通过添加TimescaleDB在Grafana中... 查看详情
Apache XMLSchema 核心 XSD/XML 解析器将根元素显示为所有子元素的父元素,而不是其直接父元素
】ApacheXMLSchema核心XSD/XML解析器将根元素显示为所有子元素的父元素,而不是其直接父元素【英文标题】:ApacheXMLSchemacoreXSD/XMLparsershowstherootelementasparentforallchildreninsteadofitsimmediateparent【发布时间】:2021-06-2806:01:39【问题描述】:... 查看详情
多层次查询深度嵌套复杂的 JSON 数据
】多层次查询深度嵌套复杂的JSON数据【英文标题】:QueryingdeeplynestedandcomplexJSONdatawithmultiplelevels【发布时间】:2021-09-2616:35:10【问题描述】:我正在努力分解从深度嵌套的复杂JSON数据中提取数据所需的方法。我有以下代码来获... 查看详情
asp.net提取多层嵌套json数据的方法
本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下。假设需要提取的json字符串如下:{"name":"lily","age":23,"addr":{"city":guangzhou,"province":guangdong}}先引用命名空间:usingNewtonsoft.Json;usingNewtonsoft.... 查看详情
scrapy选择器归纳
...a标签的href属性 a/text()选取a标签下的文本 string(.)解析出当前节点下所有文字 string(..)解析出父节点下所有文字 二、谓语谓语被嵌在方括号内,用来查找某个特定的节点或包含某个制定的值的节点语法 查看详情
Python-将多层 API JSON 解析为 CSV 的问题
】Python-将多层APIJSON解析为CSV的问题【英文标题】:Python-Issueparsingmulti-layeredAPIJSONintoCSV【发布时间】:2022-01-0113:44:24【问题描述】:我正在尝试解析NIH授权API并遇到了一个复杂的分层问题。在下面的JSON输出中,我已经能够导航... 查看详情
删除父记录时删除位于 Array 中的嵌套解析对象
】删除父记录时删除位于Array中的嵌套解析对象【英文标题】:RemovenestedparseobjectslocatedinArraywhenremovingparentrecord【发布时间】:2021-06-1021:40:20【问题描述】:我有一个自定义类Invoice,其中包含自定义类InvoiceItems的数组。当我删除I... 查看详情