记录一下扁平数组和树形结构互转

90 阅读1分钟

数组转树形

递归转换

function arrToTree(arr, pid = 0) {
  let result = [];
      arr.forEach((item) => {
        if (item.pid == pid) {
          item.children = arrToTree(arr, item.id);
          result.push(item);
        }
      });
      return result;
}

巧用map对象

function arrToTree(arr) {
  let result = [],
      map = new Map(),
      //深拷贝一下避免影响原数组
      sourceArr = JSON.parse(JSON.stringfy(arr));
      
  sourceArr.forEach((item) => {
    //先在map对象设置每一项的值
    map.set(item.id, item);
    
    //如果是pid为0,说明是顶级目录
    if (item.pid == 0) {
      result.push(item);
    } else {
      //查看当前项的父项
      let mapVal = map.get(item.pid);
      //如果有值 则在父项里面添加children,并把当前项目推入
      if (mapVal) {
        if (!mapVal.children) {
          mapVal.children = [];
        }
        mapVal.children.push(item);
      }
    }
  });
  return result;
}

树形转数组

递归转换

function  treeToArr(tree, arr = []) {
  tree.forEach((item) => {
    //解构剔除children
    let { children, ...others } = item;

    arr.push(others);

    if (children?.length) {
      treeToArr(item.children, arr);
    }
  });
  return arr;
}