已知一個多層嵌套的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 }
我又寫了一個簡單一點的方法:
ES6對數組有新增的很簡單的方法,有興趣的可以嘗試下,我忘記怎么用了,以后再更新
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <button onclick="add()">添加父節點</button> <script> var demo = [{ "children": [{ "children": [{ "children": [{ "children": [{ "children": [{ "children": [], "index": "111111" }], "index": "11111" }, { "children": [], "index": "11112" }], "index": "1111" }, { "children": [], "index": "1112" }], "index": "111" }, { "children": [{ "children": [], "index": "1121" }, { "children": [], "index": "1122" }], "index": "112" }, { "children": [], "index": "113" }], "index": "11" }, { "children": [], "index": "12" }], "index": "1" }]; console.log("old", demo); function add() { init(demo); addNode(demo) console.log("new", demo); } function init(item) { for (let i = 0; i < item.length; i++) { item[i]["parent"] = []; item[i]["parent"].push(item[i]["index"]); if (item[i].children.length !== 0) { var oChild = item[i].children; init(oChild); } } return item; } function addNode(item) { // debugger for (let i = 0; i < item.length; i++) { var parent = item[i]["parent"]; if (item[i].children.length !== 0) { var oChild = item[i].children; for (let j = 0; j < oChild.length; j++) { console.log("oChild", oChild); oChild[j]["parent"] = oChild[j]["parent"].concat(parent); } addNode(oChild); } } return item; } </script> </body> </html>