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

发布时间 2023-06-16 14:56:22作者: 芝麻小仙女

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

 

初始数组:

const list = [
      { id: "1", pid: "" },
      { id: "2", pid: "1" },
      { id: "3", pid: "1" },
      { id: "4", pid: "2" },
      { id: "5", pid: "3" },
    ];

 

最终结构:

[
    {
        "id": "1",
        "pid": "",
        "second": [
            {
                "id": "2",
                "pid": "1",
                "second": [
                    {
                        "id": "4",
                        "pid": "2"
                    }
                ]
            },
            {
                "id": "3",
                "pid": "1",
                "second": [
                    {
                        "id": "5",
                        "pid": "3"
                    }
                ]
            }
        ]
    }
]

  

方法:

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