最近看到好多大厂面试笔试有这个题!
原题:
let data = [
{ id: 1, name: "部门1", pid: 0 },
{ id: 2, name: "部门2", pid: 1 },
{ id: 3, name: "部门3", pid: 1 },
{ id: 4, name: "部门4", pid: 2 },
{ id: 5, name: "部门5", pid: 3 },
{ id: 6, name: "部门6", pid: 4 },
];
输出:
[{
id: 1,
name: "部门1",
pid: 0,
children: [
{
id: 2,
name: "部门2",
pid: 1,
children: [
// 结果 ,,,
],
},
{
id: 3,
name: "部门3",
pid: 1,
children: [
// 结果 ,,,
],
}],
}]
解法:
function arrayToTree(data) {
//创建一个空数组存放最后的对象
const reslut = [];
//创建一个空对象来过渡
const arrMap = {};
// 遍历一下这个data
for (const key of data) {
//每一项中的id与pid提取出来
const id = key.id;
const pid = key.pid;
//如果空对象中没有data里面的项,只添加一个children属性
if (!arrMap[id]) {
arrMap[id] = {
children: [],
}
//如果空对象中有data里面的项,除原来项外还添加一个children属性,并赋值
arrMap[id] = {
...key,
children: arrMap[id]["children"],
};
//把data中的每一项定义出来(也可以不定义)
const treeMap = arrMap[id];
//判断pid,pid决定对象的层级位置
if (pid === 0) {
//把第一项添加到空数组,最后返回
reslut.push(treeMap);
} else {
//如果该项中没有pid,只添加一个children属性,相当于最后一项
if (!arrMap[pid]) {
arrMap[pid] = {
children: []
}
}
//不是第一项时,其余的不同层级的项treeMap添加到children中
arrMap[pid].children.push(treeMap);
}
}
return reslut;
}
console.log(arrayToTree(data));
还有什么难点,欢迎下方留言!