代码

const data = [
  {
    id: 2,
    pid: 0,
    path: "/course",
    name: "Course",
    title: "课程管理",
  },
  {
    id: 3,
    name: "CourseOperate",
    path: "operate",
    link: "/course/operate",
    pid: 2,
    title: "课程操作",
  },
  {
    id: 4,
    name: "CourseInfoData",
    path: "info_data",
    link: "/course/operate/info_data",
    pid: 3,
    title: "课程数据",
  },
  {
    id: 5,
    name: "CourseAdd",
    path: "add",
    link: "/course/add",
    pid: 2,
    title: "增加课程",
  },
  {
    id: 6,
    pid: 0,
    path: "/student",
    name: "Student",
    title: "学生管理",
  },
  {
    id: 7,
    name: "StudentOperate",
    path: "operate",
    link: "/student/operate",
    pid: 6,
    title: "学生操作",
  },
  {
    id: 8,
    name: "StudentAdd",
    path: "add",
    link: "/student/add",
    pid: 6,
    title: "增加学生",
  },
];

// 构建树形结构的递归函数
function buildTree(node, data) {
  // 遍历数据
  data.forEach((item) => {
    // 找出当前节点的子节点
    if (item.pid === node.id) {
      // 复制子节点数据,并初始化 children 属性为空数组
      const child = { ...item, children: [] };
      // 将子节点添加到当前节点的 children 属性中
      node.children.push(child);
      // 递归处理子节点的子节点
      buildTree(child, data);
    }
  });
}

// 将扁平数据转成树形结构的函数
function flatToTree(data) {
  // 初始化结果数组
  const result = [];
  // 找出顶级节点并遍历
  data.forEach((item) => {
    if (item.pid === 0) {
      // 复制顶级节点数据,并初始化 children 属性为空数组
      const node = { ...item, children: [] };
      // 递归构建子树
      buildTree(node, data);
      // 将子树添加到结果数组中
      result.push(node);
    }
  });
  // 返回结果数组
  return result;
}

// 调用 flatToTree 函数得到树形结构
const treeData = flatToTree(data);
console.log(treeData);