javascript 实现树形结构数据排序思路 2次遍历

//例: 源数据
	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))

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qqihatetoo/article/details/86608064