树的操作

62 阅读1分钟

扁平结构转化为树结构

function flatToTree(datas, key_id = 'id', key_pid = 'parent_id') {
        const resultMap = {};
        const result = [];
        //循环flat数组将所有数据存在map中,方便后续查找
        for (let data of datas) {
          resultMap[[data[key_id]]] = data;
        }

        for (let data of datas) {
          const id = data[key_id];
          const pid = data[key_pid];
          const mapData = resultMap[id];

          if (resultMap[pid]) {
            if (!resultMap[pid].children) {
              resultMap[pid].children = [];
            }
            resultMap[pid].children.push(mapData);
          } else {
            result.push(mapData);
          }
        }

        return result;
      }

树结构转化为扁平结构

 treeToFlat(treeArr: any): object[] {
    const tree = cloneDeep(treeArr);

    const res: object[] = [];
    const getFloatStructore = (tree: any, res: object[]) => {
      tree.forEach((item: any) => {
        if (item.children && item.children.length > 0) {
          getFloatStructore(item.children, res);
        }
        delete item.children;
        res.push(item);
        return;
      });
    };
    getFloatStructore(tree, res);
    return res;
  },

获取当前id的所有父级,flatArr为扁平结构数据

  function getParentIds(flatArr, id) {
        const result = [];
        const dataMap = {};
        for (let data of flatArr) {
          dataMap[data['id']] = data;
        }
        let data = dataMap[id];
        while (dataMap[data['parent_id']]) {
          result.push(data['parent_id']);
          data = dataMap[data['parent_id']];
        }

        return result.reverse();
      }

获取tree结构的某一节点下的所有子节点

 getTreeChildIds(child: any): number[] {
   const ids: number[] = [child.id];
   const getIds = (children: any, ids: number[]) => {
     for (let i = 0; i < children.length; i++) {
       const child = children[i];
       ids.push(child.id);
       if (child.children && child.children.length > 0) {
         getIds(child.children, ids);
       }
     }
   };
   child.children ? getIds(child.children, ids) : undefined;
   return ids;
 },

获取树的高度

 getLevel(tree: any) {
  let maxLevel = 0;
  if (!tree.children) {
    return 0;
  }
  (function callBack(arr, level) {
    const newLevel = level + 1;
    maxLevel = Math.max(newLevel, maxLevel);
    for (let i = 0; i < arr.length; i++) {
      const item = arr[i];
      if (item.children && item.children.length > 0) {
        callBack(item.children, newLevel);
      } else {
        delete item.children;
      }
    }
  })(tree.children, 0);
  return maxLevel;
},
};