樹形數據結構和扁平數據機構的相互轉換

一、扁平數組轉樹形

 1 var data=[
 2 {pid:0,id:'a',value:'陝西'},
 3     {pid:'a',id:01,value:'西安'},
 4         {pid:01,id:301,value:'雁塔區'},
 5         {pid:01,id:302,value:'高新區'},
 6     {pid:'a',id:02,value:'渭南'},
 7     {pid:'a',id:03,value:'咸陽'},
 8 {pid:0,id:'b',value:'廣東'},
 9     {pid:'b',id:11,value:'廣州'},
10     {pid:'b',id:12,value:'深圳'},
11     {pid:'b',id:13,value:'潮汕'},
12 {pid:0,id:'c',value:'湖南'},
13     {pid:'c',id:21,value:'長沙'},
14     {pid:'c',id:22,value:'常德'},
15     {pid:'c',id:23,value:'岳陽'},
16 ];
17 function toTree(data){
18   let cloneData = JSON.parse(JSON.stringify(data))    // 對源數據深度克隆
19   let tree = cloneData.filter((father)=>{              //循環所有項
20         let branchArr = cloneData.filter((child)=>{
21             return father.id == child.pid;//返回每一項的子級數組
22         });
23         if(branchArr.length>0){
24             father.children = branchArr; //如果存在子級,則給父級添加一個children屬性,並賦值
25         }
26         return father.pid==0;//返回第一層
27     });
28     return tree;    //返回樹形數據
29 }
30 var tree=toTree(data);
31 console.log(tree);

//下面是遞歸實現的方法:
 1 function toTree(data) {
 2     // 刪除 所有 children,以防止多次調用
 3     data.forEach(function (item) {
 4         delete item.children;
 5     });
 6     // 將數據存儲爲 以 id 爲 KEY 的 map 索引數據列
 7     var map = {};
 8     data.forEach(function (item) {
 9         map[item.id] = item;
10     });
11     var val = [];
12     data.forEach(function (item) {
13         // 以當前遍歷項,的pid,去map對象中找到索引的id
14         var parent = map[item.pid];
15             // 好繞啊,如果找到索引,那麼說明此項不在頂級當中,那麼需要把此項添加到,他對應的父級中
16             if (parent) {
17                 (parent.children || ( parent.children = [] )).push(item);
18             } else {
19                 //如果沒有在map中找到對應的索引ID,那麼直接把 當前的item添加到 val結果集中,作爲頂級
20                 val.push(item);
21             }
22         });
23         return val;
24 }
25     console.log(toTree(data))

二、樹形數組轉扁平

 1 var data=[
 2     {id: "a",pid: 0,value: "陝西",children:[
 3         {id: 01,pid: "a",value: "西安"},
 4         {id: 02,pid: "a",value: "渭南"},
 5         {id: 03,pid: "a",value: "咸陽"},
 6     ]},
 7     {id: "b",pid: 0,value: "廣東",children:[
 8         {id: 11,pid: "b",value: "廣州"},
 9         {id: 12,pid: "b",value: "深圳"},
10         {id: 13,pid: "b",value: "潮汕"},
11     ]},
12     {id: "c",pid: 0,value: "湖南",children:[
13         {id: 21,pid: "c",value: "長沙"},
14         {id: 22,pid: "c",value: "常德"},
15         {id: 23,pid: "c",value: "岳陽"},
16     ]},    
17 ];
18 function toLine(data){
19     return data.reduce((arr, {id, value, pid, children = []}) =>
20         arr.concat([{id, value, pid}], toLine(children)), [])
21         return result;
22 }
23 var listarr=toLine(data);
24 console.log(listarr);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章