编辑代码

interface zTreeNode {
    id: number
    pid?: number
}
interface childrenTreeNode {
    id: number
    children?: childrenTreeNode[]
}

const zTreeToChildrenTree = (zTreeArray:zTreeNode[]) => {
  // 创建一个映射,用于快速查找节点
  const nodeMap = new Map();

  // 第一次遍历,将所有节点添加到映射中,并初始化children数组
  zTreeArray.forEach((node) => {
    nodeMap.set(node.id, { ...node, children: [] });
  });

  // 存储根节点
  const rootNodes: childrenTreeNode[] = [];

  // 第二次遍历,构建树结构
  zTreeArray.forEach((node) => {
    const currentNode = nodeMap.get(node.id);
    if (node.pid === null || node.pid === undefined) {
      // 如果没有父节点,说明是根节点
      rootNodes.push(currentNode);
    } else {
      // 否则,将当前节点添加到父节点的children数组中
      const parentNode = nodeMap.get(node.pid);
      if (parentNode) {
        parentNode.children.push(currentNode);
      }
    }
  });

  return rootNodes;
};

const data = [
        {
            "code": "anti",
            "icon": "folder",
            "id": 1,
            "name": "防伪管理",
            "pid": 0
        },
        {
            "code": "fnce",
            "icon": "folder",
            "id": 113,
            "name": "财务管理",
            "pid": 0
        },
        {
            "code": "pm",
            "icon": "folder",
            "id": 519,
            "name": "生产管理",
            "pid": 0
        },
        {
            "code": "ws",
            "icon": "folder",
            "id": 597,
            "name": "车间订单",
            "pid": 519
        },
        {
            "code": "apply",
            "icon": "file",
            "id": 2,
            "name": "防伪码申请",
            "pid": 1
        },
        {
            "code": "code",
            "icon": "file",
            "id": 7,
            "name": "防伪数据",
            "pid": 1
        },
        {
            "code": "log",
            "icon": "file",
            "id": 12,
            "name": "防伪日志表",
            "pid": 1
        },
        {
            "code": "report",
            "icon": "file",
            "id": 17,
            "name": "检验报告",
            "pid": 1
        },
        {
            "code": "traced",
            "icon": "file",
            "id": 22,
            "name": "溯源信息",
            "pid": 1
        },
        {
            "code": "eam",
            "icon": "folder",
            "id": 27,
            "name": "资产及设备管理",
            "pid": 0
        },
        {
            "code": "accept",
            "icon": "file",
            "id": 28,
            "name": "设备工作受理单",
            "pid": 27
        },
        {
            "code": "part",
            "icon": "folder",
            "id": 33,
            "name": "备件领料",
            "pid": 28
        },
        {
            "code": "dev",
            "icon": "file",
            "id": 38,
            "name": "资产及设备清单",
            "pid": 27
        },
        {
            "code": "attr",
            "icon": "folder",
            "id": 43,
            "name": "设备属性",
            "pid": 38
        },
        {
            "code": "check",
            "icon": "folder",
            "id": 48,
            "name": "设备点检",
            "pid": 38
        },
        {
            "code": "lists",
            "icon": "folder",
            "id": 53,
            "name": "点检明细",
            "pid": 48
        },
        {
            "code": "part",
            "icon": "folder",
            "id": 58,
            "name": "设备备件",
            "pid": 38
        },
        {
            "code": "std",
            "icon": "folder",
            "id": 63,
            "name": "点检标准",
            "pid": 38
        },
        {
            "code": "uses",
            "icon": "folder",
            "id": 68,
            "name": "借用登记",
            "pid": 38
        },
        {
            "code": "log",
            "icon": "file",
            "id": 73,
            "name": "资产日志",
            "pid": 27
        },
        {
            "code": "pandian",
            "icon": "file",
            "id": 78,
            "name": "设备盘点",
            "pid": 27
        },
        {
            "code": "lists",
            "icon": "folder",
            "id": 83,
            "name": "盘点明细",
            "pid": 78
        },
        {
            "code": "report",
            "icon": "file",
            "id": 88,
            "name": "资产报表",
            "pid": 27
        },
        {
            "code": "lists",
            "icon": "folder",
            "id": 93,
            "name": "报表明细",
            "pid": 88
        },
        {
            "code": "transfer",
            "icon": "file",
            "id": 98,
            "name": "资产调拨",
            "pid": 27
        },
        {
            "code": "type",
            "icon": "file",
            "id": 103,
            "name": "资产及设备类型",
            "pid": 27
        },
        {
            "code": "work",
            "icon": "file",
            "id": 108,
            "name": "设备运行管理",
            "pid": 27
        },
        {
            "code": "account",
            "icon": "file",
            "id": 114,
            "name": "账户管理",
            "pid": 113
        },
        {
            "code": "arrear",
            "icon": "file",
            "id": 119,
            "name": "客户欠款流程",
            "pid": 113
        },
        {
            "code": "balance",
            "icon": "file",
            "id": 124,
            "name": "财务期初表",
            "pid": 113
        },
        {
            "code": "budget",
            "icon": "file",
            "id": 129,
            "name": "财务预算",
            "pid": 113
        },
        {
            "code": "flow",
            "icon": "folder",
            "id": 134,
            "name": "预算申请",
            "pid": 129
        },
        {
            "code": "lists",
            "icon": "folder",
            "id": 139,
            "name": "预算明细",
            "pid": 129
        },
        {
            "code": "cred",
            "icon": "file",
            "id": 144,
            "name": "会计凭证表",
            "pid": 113
        },
        {
            "code": "lists",
            "icon": "folder",
            "id": 149,
            "name": "会计凭证明细表",
            "pid": 144
        },
        {
            "code": "daybook",
            "icon": "file",
            "id": 154,
            "name": "出纳日记账",
            "pid": 113
        },
        {
            "code": "lists",
            "icon": "folder",
            "id": 159,
            "name": "日记账明细",
            "pid": 154
        },
        {
            "code": "log",
            "icon": "file",
            "id": 164,
            "name": "财务日志表",
            "pid": 113
        },
        {
            "code": "month",
            "icon": "file",
            "id": 169,
            "name": "月结期间",
            "pid": 113
        },
        {
            "code": "lists",
            "icon": "folder",
            "id": 174,
            "name": "月结清单",
            "pid": 169
        },
        {
            "code": "stock",
            "icon": "folder",
            "id": 179,
            "name": "月末库存",
            "pid": 169
        },
        {
            "code": "para",
            "icon": "file",
            "id": 184,
            "name": "财务参数",
            "pid": 113
        },
        {
            "code": "project",
            "icon": "file",
            "id": 189,
            "name": "财务项目",
            "pid": 113
        },
        {
            "code": "rptcol",
            "icon": "file",
            "id": 194,
            "name": "财务报表列信息",
            "pid": 113
        },
        {
            "code": "rptinfo",
            "icon": "file",
            "id": 199,
            "name": "财务报表信息",
            "pid": 113
        },
        {
            "code": "rptsub",
            "icon": "file",
            "id": 204,
            "name": "财务报表项目与会计科目关系表",
            "pid": 113
        },
        {
            "code": "subject",
            "icon": "file",
            "id": 209,
            "name": "会计科目表",
            "pid": 113
        },
        {
            "code": "hr",
            "icon": "folder",
            "id": 214,
            "name": "人力管理",
            "pid": 0
        },
        {
            "code": "attd",
            "icon": "folder",
            "id": 215,
            "name": "考勤管理",
            "pid": 214
        },
        {
            "code": "abs",
            "icon": "file",
            "id": 216,
            "name": "请假数据",
            "pid": 215
        },
        {
            "code": "consume",
            "icon": "file",
            "id": 221,
            "name": "消费刷卡数据",
            "pid": 215
        },
        {
            "code": "dev",
            "icon": "file",
            "id": 226,
            "name": "设备管理",
            "pid": 215
        },
        {
            "code": "instruct",
            "icon": "folder",
            "id": 231,
            "name": "设备指令",
            "pid": 226
        },
        {
            "code": "log",
            "icon": "folder",
            "id": 236,
            "name": "设备日志",
            "pid": 226
        },
        {
            "code": "grp",
            "icon": "file",
            "id": 241,
            "name": "设备组管理",
            "pid": 215
        },
        {
            "code": "dev",
            "icon": "folder",
            "id": 246,
            "name": "绑定员工",
            "pid": 241
        },
        {
            "code": "hols",
            "icon": "folder",
            "id": 251,
            "name": "节假日",
            "pid": 241
        },
        {
            "code": "time",
            "icon": "folder",
            "id": 256,
            "name": "时间设置",
            "pid": 241
        },
        {
            "code": "user",
            "icon": "folder",
            "id": 261,
            "name": "绑定员工",
            "pid": 241
        },
        {
            "code": "guard",
            "icon": "file",
            "id": 266,
            "name": "门禁刷卡数据",
            "pid": 215
        },
        {
            "code": "hols",
            "icon": "file",
            "id": 271,
            "name": "节假日",
            "pid": 215
        },
        {
            "code": "leak",
            "icon": "file",
            "id": 276,
            "name": "签卡数据",
            "pid": 215
        },
        {
            "code": "log",
            "icon": "file",
            "id": 281,
            "name": "考勤日志表",
            "pid": 215
        },
        {
            "code": "over",
            "icon": "file",
            "id": 286,
            "name": "加班数据",
            "pid": 215
        },
        {
            "code": "prod",
            "icon": "file",
            "id": 291,
            "name": "IC卡计件工时",
            "pid": 215
        },
        {
            "code": "recharge",
            "icon": "file",
            "id": 296,
            "name": "工卡消费充值",
            "pid": 215
        },
        {
            "code": "records",
            "icon": "file",
            "id": 301,
            "name": "考勤数据",
            "pid": 215
        },
        {
            "code": "regmeal",
            "icon": "file",
            "id": 306,
            "name": "报餐数据",
            "pid": 215
        },
        {
            "code": "summary",
            "icon": "file",
            "id": 311,
            "name": "考勤汇总表",
            "pid": 215
        },
        {
            "code": "list",
            "icon": "folder",
            "id": 316,
            "name": "考勤汇总明细",
            "pid": 311
        },
        {
            "code": "watch",
            "icon": "file",
            "id": 321,
            "name": "保安巡更数据",
            "pid": 215
        },
        {
            "code": "position",
            "icon": "folder",
            "id": 326,
            "name": "巡更点数据",
            "pid": 321
        },
        {
            "code": "work",
            "icon": "file",
            "id": 331,
            "name": "工作排班方案管理",
            "pid": 215
        },
        {
            "code": "calendar",
            "icon": "folder",
            "id": 336,
            "name": "工作排班日历",
            "pid": 331
        },
        {
            "code": "team",
            "icon": "folder",
            "id": 341,
            "name": "工作班段",
            "pid": 331
        },
        {
            "code": "user",
            "icon": "folder",
            "id": 346,
            "name": "工作排班人员",
            "pid": 331
        },
        {
            "code": "log",
            "icon": "file",
            "id": 351,
            "name": "人事日志表",
            "pid": 214
        },
        {
            "code": "pers",
            "icon": "folder",
            "id": 356,
            "name": "人事管理",
            "pid": 214
        },
        {
            "code": "personnel",
            "icon": "file",
            "id": 357,
            "name": "员工信息管理",
            "pid": 356
        },
        {
            "code": "adjust",
            "icon": "folder",
            "id": 362,
            "name": "调整工作记录",
            "pid": 357
        },
        {
            "code": "contract",
            "icon": "folder",
            "id": 367,
            "name": "合同管理",
            "pid": 357
        },
        {
            "code": "family",
            "icon": "folder",
            "id": 372,
            "name": "家庭成员",
            "pid": 357
        },
        {
            "code": "hols",
            "icon": "folder",
            "id": 377,
            "name": "假期管理",
            "pid": 357
        },
        {
            "code": "teach",
            "icon": "folder",
            "id": 382,
            "name": "教育/培训经历",
            "pid": 357
        },
        {
            "code": "tmp",
            "icon": "folder",
            "id": 387,
            "name": "生物识别模板",
            "pid": 357
        },
        {
            "code": "work",
            "icon": "folder",
            "id": 392,
            "name": "工作经历",
            "pid": 357
        },
        {
            "code": "wage",
            "icon": "folder",
            "id": 397,
            "name": "薪资管理",
            "pid": 214
        },
        {
            "code": "aperiod",
            "icon": "file",
            "id": 398,
            "name": "工资期间表",
            "pid": 397
        },
        {
            "code": "detailed",
            "icon": "file",
            "id": 403,
            "name": "日常应得与扣款明细",
            "pid": 397
        },
        {
            "code": "fixed",
            "icon": "file",
            "id": 408,
            "name": "固定明细",
            "pid": 397
        },
        {
            "code": "log",
            "icon": "file",
            "id": 413,
            "name": "工资日志表",
            "pid": 397
        },
        {
            "code": "rbtp",
            "icon": "file",
            "id": 418,
            "name": "计件工资数据",
            "pid": 397
        },
        {
            "code": "salary",
            "icon": "file",
            "id": 423,
            "name": "工资表管理",
            "pid": 397
        },
        {
            "code": "lists",
            "icon": "folder",
            "id": 428,
            "name": "工资表明细",
            "pid": 423
        },
        {
            "code": "scheme",
            "icon": "file",
            "id": 433,
            "name": "工资计算方案",
            "pid": 397
        },
        {
            "code": "formula",
            "icon": "folder",
            "id": 438,
            "name": "工资计算方案公式",
            "pid": 433
        }]

const result = zTreeToChildrenTree(data);

console.log(result);