您的位置:首页 > Web前端 > JavaScript

javascript将扁平的数据转为树形结构

2017-11-29 13:03 453 查看
方式1(最高效)

/**将扁平的结构转换为树形结构
* 1 将格式转为类似josn格式
* 2 一个for循环,将它添加到它所在的父节点的children中
*/
function build(menuList){
console.time('build')
let temp = {};
let ans = {};
for(let i in menuList){
temp[menuList[i].id] = menuList[i];
}
for(let i in temp){
if(temp[i].parent_id) {
if(!temp[temp[i].parent_id].children) {
temp[temp[i].parent_id].children = new Object();
}
temp[temp[i].parent_id].children[temp[i].id] = temp[i];
} else {
ans[temp[i].id] = temp[i];
}
}
console.timeEnd('build');
return ans;
}

console.log(build(menu_list));

方式二
/**
* 将扁平的结构转换为树形结构
* 1将节点分类,分别装到数组的对应层中
* 2 从最后一层向上遍历,将节点赛到上一层他父节点的chilren中
*  使用限制:
*  节点必须标有层数表示它在哪一层
* 传入数组中对象必要参数:id, menu_level, parent_id
*/
function buildMenu(menuList){
console.time('buildMenu')
let levels = new Array();
//第一个for循环,将menulist数组中每个对象转为类似JOSN格式-> id : {}
for(let i in menuList){
//将每个menuList[i]转成对象,装到levels数组中,在第i层装到level[i-1]中
if(!levels[menuList[i].menu_level]){
levels[menuList[i].menu_level] = new Object();
}
levels[menuList[i].menu_level][menuList[i].id] = menuList[i];
}
//将父往子里面塞
for(let i = levels.length -1; i > 0; i--){
for(let obj in levels[i]){
//向这个节点的父节点的children里加她自己
if(levels[i - 1][levels[i][obj].parent_id].children == undefined){
levels[i - 1][levels[i][obj].parent_id].children = new Object();
}
levels[i - 1][levels[i][obj].parent_id ].children[levels[i][obj].id] = levels[i][obj];
}
}
console.timeEnd('buildMenu');
return levels[0];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: