471 字
2 分钟
数组转树形结构

这是一道面试题

要求如下,把 data 转换成树形结构

const data = [
{ id: "01", name: "张大大", pid: "", job: "项目经理" },
{ id: "02", name: "小亮", pid: "01", job: "产品leader" },
{ id: "03", name: "小美", pid: "01", job: "UIleader" },
{ id: "04", name: "老马", pid: "01", job: "技术leader" },
{ id: "05", name: "老王", pid: "01", job: "测试leader" },
{ id: "06", name: "老李", pid: "01", job: "运维leader" },
{ id: "07", name: "小丽", pid: "02", job: "产品经理" },
{ id: "08", name: "大光", pid: "02", job: "产品经理" },
{ id: "09", name: "小高", pid: "03", job: "UI设计师" },
{ id: "10", name: "小刘", pid: "04", job: "前端工程师" },
{ id: "11", name: "小华", pid: "04", job: "后端工程师" },
{ id: "12", name: "小李", pid: "04", job: "后端工程师" },
{ id: "13", name: "小赵", pid: "05", job: "测试工程师" },
{ id: "14", name: "小强", pid: "05", job: "测试工程师" },
{ id: "15", name: "小涛", pid: "06", job: "运维工程师" },
];

方法一(性能不是那么好)#

function transformArrToTree(arr) {
/** 存储所有id对应项 */
const idMap = {};
const res = [];
arr.forEach((item) => {
const { id } = item;
idMap[id] = item;
});
arr.forEach((item) => {
const { pid } = item;
if (!pid) {
res.push(item);
} else {
const parent = idMap[pid];
if (parent.children) {
parent.children.push(item);
} else {
parent.children = [item];
}
}
});
return res;
}
Terminal window
计算时间: 0.235107421875 ms

方法二(好啊)#

维护一个 json 的 map,每一个 id 都有自己的 children 和本身的数据, 把属于这个 id 的 pid 项都存入 children 数组,因为 json 的 map 都是对象,浅拷贝下, 只要是属于这个对象的 children 数组都会是同一个

function transformArrToTree(arr) {
const idMap = {};
const res = [];
arr.forEach((item) => {
const { pid, id } = item;
idMap[id] = {
...item,
children: !idMap[id] ? [] : idMap[id].children,
};
if (!pid) {
res.push(idMap[id]);
} else {
const parent = idMap[pid];
if (!parent) {
idMap[pid] = {
children: [idMap[id]],
};
} else {
parent.children.push(idMap[id]);
}
}
});
return res;
}
Terminal window
计算时间: 0.193115234375 ms
数组转树形结构
https://nollieleo.github.io/posts/手写数组转树形结构/
作者
翁先森
发布于
2023-02-24
许可协议
CC BY-NC-SA 4.0