js將json數組轉成tree對象
阿新 • • 發佈:2018-06-28
子節點 數據 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對象