初始化數據node
var data = [ { parentId: 0, id: 1, value: '1' }, { parentId: 3, id: 2, value: '2' }, { parentId: 0, id: 3, value: '3' }, { parentId: 1, id: 4, value: '4' }, { parentId: 1, id: 5, value: '5' } ]
輸出結果函數
[ { id:1, value:'1', children:[ {id:4,value:'4',children:[]}, {id:5,value:'5',children:[]} ] },{ id:3, value:'3', children:[ {id:2,value:'2',children:[]} ] } ]
轉換函數spa
function convertArrayToTree(arr){ let idsMap = {}, result = [], node, parentNode, item, j, leng = arr.length; for(j = 0; j <= leng; j++ ){ item = arr[j]; if(!idsMap['$'+ item.id]){ node = {id: item.id, children: []} idsMap['$'+ item.id] = node; }else{ node = idsMap['$'+ item.id]; } node.value = item.value; if(item.parentId === 0){ result.push(node); }else{ if(!idsMap['$'+ item.parentId]){ parentNode = {id: item.parentId, children: []} idsMap['$'+ item.parentId] = parentNode; }else{ parentNode = idsMap['$'+ item.parentId]; } parentNode.children.push(node); } } return result; }
這個轉換函數不受數據關係層級的限制,不管有多少層關係,只要一次循環就能搞定。假如一羣人都是爺爺、父親、兒子、孫子的關係,每一個人只知道本身的位置和他父親的位置。全部人拿一根線,從他本身的位置開始,走到他父親的位置,那麼這個樹形結構就完成了。code
在這裏,咱們用一個 idsMap 比喻這樣的集合,id 做位健值。每一個節點有本身和他父節點 id,找到父節點,而後把他本身 push 到父節點的 children 中。blog
只要每一個節點都作完了,樹形就出來了。圖片