如何将扁平的数组处理成树形结构

突然觉得好像挺常用的,记下来方便以后抄。

 

初始数组:

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,就说明他自己是一个父节点,直接塞入新数组里。

 

posted @   芝麻小仙女  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示