tree 的遞迴演算法
阿新 • • 發佈:2020-07-13
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 }