前端筆試題:數組轉樹形結構

初始化數據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

圖片描述

只要每一個節點都作完了,樹形就出來了。圖片

相關文章
相關標籤/搜索