给出如下一维数组:
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 转成如下,树状结构
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:'四川省'
}
]
};
下面是一个完成上面需求的函数:
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);
下在逆推回去
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;
}
有什么可以改进的欢迎指出,今天就到这里