如何将扁平的数组处理成树形结构
突然觉得好像挺常用的,记下来方便以后抄。
初始数组:
const list = [ { id: "1", pid: "" }, { id: "2", pid: "1" }, { id: "3", pid: "1" }, { id: "4", pid: "2" }, { id: "5", pid: "3" }, ];
最终结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | [ { "id" : "1" , "pid" : "" , "second" : [ { "id" : "2" , "pid" : "1" , "second" : [ { "id" : "4" , "pid" : "2" } ] }, { "id" : "3" , "pid" : "1" , "second" : [ { "id" : "5" , "pid" : "3" } ] } ] } ] |
方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | concatList(data) { const newObj = {}; data.forEach((item) => { newObj[item.id] = item; }); const newData = []; data.forEach((item) => { const parentObj = newObj[item.pid]; if (parentObj) { parentObj.second = [...(parentObj.second || []), item]; } else { newData.push(item); } }); return newData; } |
思路:
把初始数组全部放到一个对象中,用id做key值,对象内容就是其value;
然后遍历初始数组的数据,如果数据的pid在对象里能找到对应的key,就说明他的pid=这个id,就塞到那个数据的second(可以理解为children)里;
如果这个数据没有在对象里找到对应的key,就说明他自己是一个父节点,直接塞入新数组里。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具