//例: 源数据
var dataItems = [
{id:"1",pid:"0"},
{id:"2",pid:"0"},
{id:"3",pid:"0"},
{id:"1.1",pid:"1"},
{id:"1.2",pid:"1"},
{id:"3.1",pid:"3"},
{id:"2.1",pid:"2"},
{id:"2.2",pid:"2"},
{id:"1.1.1",pid:"1.1"},
{id:"2.1.1",pid:"2.1"},
{id:"3.1.1",pid:"3.1"},
{id:"1.2.1",pid:"1.2"},
{id:"2.2.1",pid:"2.2"},
{id:"3.1.2",pid:"3.1"},
]
function remakeData(items){
let newDataItems = [] //存放结果数据
let pidItemsDic = {} //结构 pid:子集的数组 字典查询速度快
//将数据筛选 装入字典
for(let i = 0; i < items.length; i++){
let item = items[i]
if(!pidItemsDic[item.pid])
pidItemsDic[item.pid] = [item]
else
pidItemsDic[item.pid].push(item)
}
getSonArrByPid(0, 0) //传入pid为0或空 即获取0级菜单, 传入level-0 方便实现页面渲染菜单缩进
//类似二叉树前序遍历 循环菜单查找子菜单,因为线性执行,所以一条分支找完才会去查找下一条分支
function getSonArrByPid(pid, level){
let itemsTemp = pidItemsDic[pid] || [] //pid对应子集 缺省值[]
for (let i = 0; i < itemsTemp.length; i++) {
let item = itemsTemp[i]
item["level"] = level + 1
newDataItems.push(item)
//存在子集递归
if(pidItemsDic[item.id])
getSonArrByPid(item.id, item.level)
}
}
return newDataItems
}
console.log(remakeData(dataItems))
javascript 实现树形结构数据排序思路 2次遍历
猜你喜欢
转载自blog.csdn.net/qqihatetoo/article/details/86608064
今日推荐
周排行