1. 程式人生 > 實用技巧 >tree 的遞迴演算法

tree 的遞迴演算法

1.根據code ,尋找tree裡面的選中物件

export function getActiveNode(tree,code){ tree: [{}] // 樹型結構
  let node = {};
  finds(tree,code);
  function finds(tree,code) {
    for(let i=0;i<tree.length;i++){
      if(tree[i].code == code){
        node = tree[i]
      } else {
        if(tree[i].children && tree[i].children.length>0){
          finds(tree[i].children,code)
        }
      }
    }
  }
  
return node; }

2.通過code篩選組織樹節點,輸出 [{}]

export function filterNode (tree, code) {
  if (!code) {return}
  let resultArr = []
  for (let i = 0; i < tree.length; i++) {
    let item = tree[i]
    if (item.code == code) {
      resultArr.push(item)
      return resultArr
    } else if (item.children && item.children.length) {
      resultArr 
= filterNode(item.children, code) } } return resultArr }

3.有父子關係的陣列轉換成樹形結構的陣列

/**
* 該方法用於將有父子關係的陣列轉換成樹形結構的陣列
* 接收一個具有父子關係的陣列作為引數
* 返回一個樹形結構的陣列 
*/
export function translateDataToTree (data) {
  let parents = data.filter((item,index) => {return index === data.length-1})
  //有父節點的資料
  let childrens = data.filter(value => value.parentCode)
  
//定義轉換方法的具體實現 let translator = (parents, childrens) => { parents.forEach((parent) => { childrens.forEach((current, index) => { if (current.parentCode === parent.code) { //對子節點資料進行深複製,這裡只支援部分型別的資料深複製,對深複製不瞭解的童靴可以先去了解下深複製 let temp = JSON.parse(JSON.stringify(childrens)) //讓當前子節點從temp中移除,temp作為新的子節點資料,這裡是為了讓遞迴時,子節點的遍歷次數更少,如果父子關係的層級越多,越有利 temp.splice(index, 1) //讓當前子節點作為唯一的父節點,去遞迴查詢其對應的子節點 translator([current], temp) //把找到子節點放入父節點的childrens屬性中 typeof parent.children !== 'undefined' ? parent.children.push(current) : parent.children = [current] } }) }) } //呼叫轉換方法 translator(parents, childrens) //返回最終的結果 console.log(parents) return parents }