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;}计算时间: 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;}计算时间: 0.193115234375 ms