js将对象数组中具有父子关系的数据换成树形结构

 



let allRes = [
{
id: 4,
resName: "删除角色",
parentId: 2
},
{
id: 3,
resName: "编辑角色",
parentId: ''
},
{
id: 2,
resName: "设置权限",
parentId: ''
},
{
id: 5,
resName: "添加用户",
parentId: 4
},
{
id: 6,
resName: "更新用户",
parentId: 4
},
{
id: 7,
resName: "删除用户",
parentId: 6
},
{
id: 8,
resName: "重置密码",
parentId: 3
},
{
id: 9,
resName: "添加地区",
parentId: 5
},
{
id: 10,
resName: "编辑地区",
parentId: 6
}
];
















1
var treeTool = { 2 convet: function (data, attributes) { 3 var _that = this; 4 let resData = data; 5 let tree = []; 6 //找寻根节点 7 for (let i = 0; i < resData.length; i++) { 8 var p = resData[i]; 9 if (p[attributes.pid] === '' || p[attributes.pid] === null || p[attributes.pid] <=0) { 10 let obj = _that.copy(p) 11 tree.push(obj); 12 resData.splice(i, 1); 13 i--; 14 } 15 } 16 findchild(tree); 17 //找寻子树 18 function findchild(chiArr) { 19 if (resData.length !== 0) { 20 for (let i = 0; i < chiArr.length; i++) { 21 for (let j = 0; j < resData.length; j++) { 22 23 var p = resData[j]; 24 if (chiArr[i][attributes.id] === p[attributes.pid]) { 25 let obj = _that.copy(p); 26 chiArr[i].children.push(obj); 27 resData.splice(j, 1); 28 j--; 29 } 30 } 31 findchild(chiArr[i].children); 32 } 33 } 34 } 35 return tree; 36 }, 37 copy: function (originObj) { 38 39 //对象深拷贝 40 let obj = {}; 41 for (key in originObj) { 42 var val = originObj[key]; 43 obj[key] = typeof val === 'object' ? arguments.callee(val) : val; 44 } 45 //对象新增children键值,用于存放子树 46 obj['children'] = []; 47 return obj; 48 49 }, 50 }; 51 let atts= { 52 id: 'id', 53 pid: 'parentId', 54 }; 55 var treet= treeTool.convet(data,atts);

 

 

 

  1 let allRes = [
  2   {
  3     id: 4,
  4     resName: "删除角色",
  5     parentId: 2
  6   },
  7   {
  8     id: 3,
  9     resName: "编辑角色",
 10     parentId: ''
 11   },
 12   {
 13     id: 2,
 14     resName: "设置权限",
 15     parentId: ''
 16   },
 17   {
 18     id: 5,
 19     resName: "添加用户",
 20     parentId: 4
 21   },
 22   {
 23     id: 6,
 24     resName: "更新用户",
 25     parentId: 4
 26   },
 27   {
 28     id: 7,
 29     resName: "删除用户",
 30     parentId: 6
 31   },
 32   {
 33     id: 8,
 34     resName: "重置密码",
 35     parentId: 3
 36   },
 37   {
 38     id: 9,
 39     resName: "添加地区",
 40     parentId: 5
 41   },
 42   {
 43     id: 10,
 44     resName: "编辑地区",
 45     parentId: 6
 46   }
 47 ];
 48  
 49 function treeObj(originObj){
 50     //对象深拷贝
 51     let obj ={};
 52     for (key in originObj){
 53         var val = originObj[key];
 54           obj[key] = typeof val === 'object' ? arguments.callee(val):val;
 55    }
 56    //对象新增children键值,用于存放子树
 57    obj['children'] = [];
 58    return obj;
 59 }
 60  
 61 //data:带转换成树形结构的对象数组
 62 //attributes:对象属性
 63 function toTreeData (data, attributes) {
 64   let resData = data;
 65   let tree = [];
 66  
 67  //找寻根节点
 68   for (let i = 0; i < resData.length; i++) {
 69  
 70     if (resData[i][attributes.parentId] === ''|| resData[i][attributes.parentId] === null) {
 71       tree.push( treeObj(resData[i]) );
 72       resData.splice(i, 1);
 73       i--;
 74     }
 75   }
 76  
 77   run(tree);
 78  
 79   //找寻子树
 80   function run(chiArr) {
 81     if (resData.length !== 0) {
 82       for (let i = 0; i < chiArr.length; i++) {
 83         for (let j = 0; j < resData.length; j++) {
 84           if (chiArr[i][attributes.id] === resData[j][attributes.parentId]){
 85             let obj = treeObj(resData[j]);
 86             chiArr[i].children.push(obj);
 87             resData.splice(j, 1);
 88             j--;
 89           }
 90         }
 91         run(chiArr[i].children);
 92       }
 93     }
 94   }
 95  
 96   return tree;
 97  
 98 }
 99  
100 let data = allRes;
101 // 属性配置信息
102 let attributes = {
103       id: 'id',
104       parentId: 'parentId',
105   };
106 let treeData = toTreeData(data, attributes);
107  
108 console.log(treeData);
109 </script>

 

posted on 2018-08-08 18:18  高达  阅读(759)  评论(0)    收藏  举报

导航