js一维数组还原树形结构,今天下面的例子涉及到对数组的操作,写下笔记留着备用
给出如下一维数组
1 2 3 4 5 6 7 | var arr = [ {id:1,pid:null,name:'中国'}, {id:2,pid:1,name:'湖北省'}, {id:3,pid:2,name:'武汉市'}, {id:4,pid:2,name:'恩施州'}, {id:5,pid:1,name:'四川省'}, ]; |
请写一个函数将 arr 转成如下,树状结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | obj = { id:1, pid:null, name:'中国', child:[ { id:2, pid:1, name:'湖北省', child:[ { id:3, pid:2, name:'武汉市' }, { id:4, pid:2, name:'恩施州' } ] }, { id:5, pid:1, name:'四川省' } ] }; |
下面是一个完成上面需求的函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | function t(arr,removeIndex){ if(removeIndex instanceof Array){ for(var index of removeIndex.reverse()){ arr.splice(index,1); } } if(arr.length == 1) return arr[0]; var indexArr = arr.map(function(obj,index){ return obj.pid; }) var maxPid = Math.max.apply(null,indexArr);//找到底层的pid var removeIndex = []; var pushArr = arr.filter(function(obj,index){ if(obj.pid == maxPid){ removeIndex.push(index); } return obj.pid == maxPid; });//找到最底层的 数据 var currentIndex = arr.findIndex(function(obj,index){ return obj.id == maxPid });//找到最底层的上一层 arr[currentIndex].child = pushArr;//将最底层数据放到上一层的数据中 return t(arr,removeIndex);//依次递归 } t(arr); |
下在逆推回去
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function t1(obj,arr){ if(!(arr instanceof Array)){ arr = []; } if(obj.child instanceof Array){ child = obj.child; for(var _obj of child){ t1(_obj,arr) } } delete obj.child; arr.push(obj); return arr; } |
7