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>