針對性的遍歷tree數據,獲取所需要的內容(獲取id數組、id對應的層級數組、來獲取當前的對象)


目的:針對性的遍歷tree數據,獲取所需要的內容

 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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM