法一:递归实现
function findParent(res, obj) {
if (Array.isArray(res)) {
for (let i = 0; i < res.length; i++) {
const item = res[i];
if (item.id === obj.pid) {
Array.isArray(item['children']) ? item['children'].push(obj) : item['children'] = [obj]
} else {
if (item['children'] && item['children'].length) {
findParent(item['children'], obj)
}
}
}
}
}
function toTree(arr) {
arr = arr.sort((a, b) => a.pid - b.pid)
let res = []
for (let i = 0; i < arr.length; i++) {
const obj = arr[i];
if (obj.pid == 0) {
res.push(obj)
} else {
findParent(res, obj)
}
}
return res
}
let arr = [
{id: 1, name: '部门1', pid: 0},
{id: 2, name: '部门2', pid: 1},
{id: 3, name: '部门3', pid: 1},
{id: 4, name: '部门4', pid: 3},
{id: 5, name: '部门5', pid: 4},
{id: 6, name: '部门6', pid: 4},
]
console.log(toTree(arr));
法二:空间换取时间
function arrayToTree(items) {
const result = [];
const itemMap = {};
for (const item of items) {
const id = item.id;
const pid = item.pid;
itemMap[id] = {
...item,
children: !itemMap[id] ? [] : itemMap[id]["children"],
};
const treeItem = itemMap[id];
if (pid === 0) {
result.push(treeItem);
} else {
if (!itemMap[pid]) {
itemMap[pid] = {
children: [],
};
}
itemMap[pid].children.push(treeItem);
}
}
return result;
}
let arr = [
{ id: 6, name: "部门6", pid: 4 },
{ id: 1, name: "部门1", pid: 0 },
{ id: 2, name: "部门2", pid: 1 },
{ id: 3, name: "部门3", pid: 1 },
{ id: 4, name: "部门4", pid: 3 },
{ id: 5, name: "部门5", pid: 4 },
];
console.log(arrayToTree(arr));