树形与扁平数据结构相互转换

359 阅读1分钟

一、树形转扁平

递归
  1. 循环数组,取出每个对象进行判断
  2. 如果有children属性,将children传到flat函数重复执行,并将执行的结构返回数组,加入到新数组中,然后删除当前对象的children属性
  3. 不管是否有children属性,都要将当前对象结构,然后加入新数组中
let arr1 = [
    {
        "id": 1,
        "name": "部门1",
        "pid": 0,
        "children": [
            {
                "id": 2,
                "name": "部门2",
                "pid": 1,
                "children": []
            },
            {
                "id": 3,
                "name": "部门3",
                "pid": 1,
                "children": [
                    {
                    "id": 4,
                    "name": "部门4",
                    "pid": 3,
                    "children": [
                        {
                        "id": 5,
                        "name": "部门5",
                        "pid": 4,
                        "children": []
                        }
                        ]
                    }
                ]
            }
        ]
    }
]
function flat(arr) {
        var newArr = [];
        for (let i = 0; i < arr.length; i++) {
          if (arr[i].children) {
            newArr.push(...flat(arr[i].children));
            delete arr[i].children;
          }
          newArr.push({ ...arr[i] });
        }
        console.log(newArr);
        return newArr;
      }

1663181248822.png

二、扁平转树形

思想:
使用Map来存储不同的id,对应的所在的内存地址,根据对应pid的值,找到你要加入到对象对应的位置

let arr = [
    {id: 1, name: '部门1', pid: 0},
    {id: 2, name: '部门2', pid: 1},
    {id: 3, name: '部门3', pid: 1},
    {id: 4, name: '部门4', pid: 3},
    {id: 5, name: '部门5', pid: 4},
]
function getTreeData(data){
              let treeData = [];
              let map = new Map();
              let outputObj,pid;
              for(let i=0;i<data.length;i++){
                  pid = data[i].pid
                  if(map.has(pid)){
                    if(!map.get(pid).children)
                      map.get(pid).children = []
                    let obj = new Object(data[i]);
                    map.get(pid).children.push(obj);
                    map.set(data[i].id,obj);
                  } else if(!map.has(pid) && pid==0){
                      outputObj = new Object(data[i]); //拷贝
                      treeData.push(outputObj);
                      map.set(data[i].id,outputObj);
              }
          }
          return treeData;
        }
Map

set()设置键名key对应的键值为value
has()方法返回一个布尔值,表示某个键是否在当前 Map 对象之中
get()读取key对应的键值

_20220915023914.jpg

参考:

www.bilibili.com/video/BV1Tv…

www.bilibili.com/video/BV1y5…