1 /** 2 * 功能:級聯選擇器,后台一般只返回最后一級的id和整個樹結構,前台頁面回顯內容時,需要根據最后一級的id,遍歷樹結構得到相應的id數組 3 * 函數名:getTreeDeepArr 4 * 參數:value--是比較值;treeData--完整的樹表;key--value對應的屬性名 5 */ 6 function baseGetTreeDeepArr(value, treeData, key) { 7 let arr = [] // 在遞歸時操作的數組 8 let returnArr = [] // 存放結果的數組 9 let depth = 0 // 定義全局層級 10 // 定義遞歸函數 11 function childrenEach(childrenData, depthN) { 12 for (var j = 0; j < childrenData.length; j++) { 13 depth = depthN // 將執行的層級賦值 到 全局層級 14 arr[depthN] = (childrenData[j][key]) 15 16 if (childrenData[j][key] == value) { 17 // returnArr = arr; // 原寫法不行, 因 此賦值存在指針關系 18 returnArr = arr.slice(0, depthN + 1) // 將目前匹配的數組,截斷並保存到結果數組, 19 break 20 } else { 21 if (childrenData[j].children) { 22 depth++ 23 childrenEach(childrenData[j].children, depth) 24 } 25 } 26 } 27 return returnArr 28 } 29 return childrenEach(treeData, depth) 30 } 31 32 /** 33 * 功能:級聯選擇器,取當前選中id對應的文字,得到的是當前選中的id的數組,對應的層級數組 34 * 函數名:getArrCascaderObj 35 * 參數:arr--是id數組;treeData--完整的樹表;key--是對比的字段名 36 */ 37 function baseGetArrCascaderObj(arr, treeData, key) { 38 return arr.map(function (value, index, array) { 39 // console.log(value) 40 for (var itm of treeData) { 41 if (itm[key] == value) { treeData = itm.children; return itm } 42 } 43 return null 44 }) 45 } 46 47 /** 48 * 功能:在級聯選擇器,利用某個值不會重復的字段,來獲取當前的對象,例如利用ID,獲取 49 * 參數:value要對比的值;treeData級聯對象;key要對比的關鍵字 50 * */ 51 function baseGetCascaderObj(value, treeData, key) { 52 let opath = null 53 for (var i in treeData) { 54 if (value === treeData[i][key]) { 55 opath = treeData[i] 56 break 57 } else if (treeData[i].children && treeData[i].children.length) { 58 opath = baseGetCascaderObj(value, treeData[i].children, key) 59 } 60 // 中斷循環 61 if (opath) { 62 break 63 } 64 } 65 return opath 66 }
哈哈~~~最近有個同事問我一個關於tree屬性修改的問題~~~沒有想到直接修改tree屬性的解決方法...2333...但是想到一種通過深拷貝的方式來克隆一份,再重新賦值的方法:
注意:本方法具有很大的受限性(必須要已知tree結構、屬性,根據個人需要修改內容)
// 新數據 let newTreeData = [] // 舊數據 let treeData = [{ companyName: 'Node0', companyId: '0--0', level: 1, sum: 2, addr: '123', child: [{ companyName: 'Node1', companyId: '0-0', level: 1, sum: 2, addr: '123', child: [ { companyName: 'Child Node1', companyId: '0-0-0', level: 1, sum: 2, addr: '123', }, ], }, { companyName: 'Node2', companyId: '0-1', level: 1, sum: 2, addr: '123', child: [ { companyName: 'Child Node3', companyId: '0-1-0', level: 1, sum: 2, addr: '123', }, { companyName: 'Child Node4', companyId: '0-1-1', level: 1, sum: 2, addr: '123', }, ], }] }] /** * FIXME:該函數只用於簡單深拷貝tree數據--必須已知tree的結構和具有的屬性--可重新根據個人需要修改屬性 * param1: treeData標識舊數據 * param2:newTreeData標識新數據,必須是外部傳入的數組引用,這樣就可以用來保存新的tree數據了 * **/ export function mapTreeData(treeData, newTreeData) { if (!treeData) { return } for (let key in treeData) { let od = {} let ot = treeData[key] if (!ot) { return null } od = { name: ot.companyName, key: ot.companyId, value: ot.companyId, children: [] } newTreeData.push(od) let len = newTreeData.length - 1 if (ot.child && ot.child.length) { mapTreeData(ot.child, newTreeData[len].children) } } } // 測試調用 mapTreeData(treeData, newTreeData) // 打印數據 console.log('treeData, newTreeData', treeData, newTreeData)