1. 程式人生 > >js將json數組轉成tree對象

js將json數組轉成tree對象

子節點 數據 In 代碼 pan 原理 each 今天 ole

昨天遇到一道面試題,手寫js將json數組轉成tree對象,昨天寫錯了,今天特意想了下,思路其實挺簡單,循環+遞歸,獲取子節點對象。

1 let data = [
2     {‘parent_id‘: 0, ‘id‘: 1, ‘value‘: ‘XXX‘},
3     {‘parent_id‘: 1, ‘id‘: 3, ‘value‘: ‘XXX‘},
4     {‘parent_id‘: 4, ‘id‘: 6, ‘value‘: ‘XXX‘},
5     {‘parent_id‘: 3, ‘id‘: 5, ‘value‘: ‘XXX‘},
6     {‘parent_id‘: 2, ‘id‘: 4, ‘value‘: ‘XXX‘},
7 {‘parent_id‘: 1, ‘id‘: 2, ‘value‘: ‘XXX‘}, 8 ]

主要方法如下,使用的是es6語法

 1 let toTree = (arr, key = ‘id‘, pkey = ‘pid‘, children=‘children‘) => {
 2      if(arr.length === 0){
 3          return {}
 4      }
 5      return getChildren(arr, 0) // 此處的0代表根節點,如有的根節點標識符為‘#‘,那麽此處則為‘#‘
 6       
 7    // 主要原理是通過查找父節點parent_id為pid的對象,再一層一層往下查找子節點id,看是否存在parent_id等於id的對象
8 function getChildren(arr, pid) { 9 let temp = {} 10 arr.forEach(v => { 11 if(v[pkey] === pid){ 12 temp[v[key]] = {} // 此處可根據相應需求作調整 13 if(Object.keys(getChildren(arr, v[key])).length !== 0){ // 如果存在子節點,此處也可將遞歸方法抽離出來,以減少代碼量和操作 14 temp[v[key]][children] = getChildren(arr, v[key]) //
此處可根據相應需求作調整 15 } 16 } 17 }) 18 return temp 19 } 20 }

測試數據

 1 let tree = toTree(data)
 2 console.log(JSON.stringify(tree))
 3 
 4 // 結果為:
 5 {
 6     "1": {
 7         "children": {
 8             "2": {
 9                 "children": {
10                     "4": {
11                         "children": {
12                             "6": {}
13                         }
14                     }
15                 }
16             },
17             "3": {
18                 "children": {
19                     "5": {}
20                 }
21             }
22         }
23     }
24 }

js將json數組轉成tree對象