突然琢磨出来个很简单的算法, 希望对大家有思路上的帮助
let baseArr = [
{id: 1, pid: 0},
{id: 2, pid: 1},
{id: 3, pid: 2},
{id: 4, pid: 2},
{id: 5, pid: 1},
{id: 6, pid: 1},
{id: 7, pid: 5},
{id: 8, pid: 0},
]
/**
* 利用引用对象都是址的特性进行树形数据格式化
* @param data 数据
* @param id id的key
* @param pid 与父级数据关联的key
* @param topPid 顶层数据的parentId的值
* @return {*[]}
*/
function toTreeData (data, id = 'id', pid = 'pid', topPid = 0) {
let obj = {}
// 将所有一维数据整理到对象中,方便接下来操作
for (let i = 0; i < data.length; i++) {
obj[data[i][id]] = {...data[i], children: undefined}
}
// 最终返回的数据
let returnArr = []
for (let i = 0; i < data.length; i++) {
// 判断本条数据的父id是否是顶层id
// 如果是 则直接添加到 returnArr中
// 如果不是 则找到本行数据在obj中的对象 放入其父节点的children中
if (data[i][pid] !== topPid) {
obj[data[i][pid]].children ? '' : (obj[data[i][pid]].children=[])
obj[data[i][pid]].children.push(obj[data[i][id]])
} else {
returnArr.push(obj[data[i][id]])
}
}
return returnArr
}
console.log(toTreeData(baseArr))