平铺数组转树型结构数据的方法(非递归)

116 阅读3分钟
  <script>
    // 平铺数组数据
    const rawData = [
      { id: '604e21feb205b95968e13129', pid: '', name: '总裁办', code: '1001', manager: '管理员', introduce: '公司战略部', createTime: '2021-03-14 22:47:25' },
      { id: '604e222bb205b95968e1312a', pid: '', name: '行政部', code: 'XZB', manager: '管理员', introduce: '行政部', createTime: '2021-03-14 22:47:25' },
      { id: '604e223fb205b95968e1312b', pid: '', name: '人事部', code: 'RSB', manager: '管理员', introduce: '人事部', createTime: '2021-03-14 22:47:25' },
      { id: '604e2251b205b95968e1312c', pid: '', name: '财务部', code: 'CWB', manager: '管理员', introduce: '财务部', createTime: '2021-03-14 22:47:25' },
      { id: '604e2262b205b95968e1312d', pid: '604e2251b205b95968e1312c', name: '财务核算部', code: 'CWHSB', manager: '管理员', introduce: '财务核算部', createTime: '2021-03-14 22:47:25' },
      { id: '604e227db205b95968e1312e', pid: '604e2251b205b95968e1312c', name: '税务管理部', code: 'SWGLN', manager: '管理员', introduce: '税务管理部', createTime: '2021-03-14 22:47:25' },
      { id: '604e2297b205b95968e1312f', pid: '604e2251b205b95968e1312c', name: '薪资管理部', code: 'XZGLB', manager: '管理员', introduce: '薪资管理部', createTime: '2021-03-14 22:47:25' },
      { id: '6051ad90e93db6522c1d00d2', pid: '', name: '技术部', code: 'JSB', manager: '孙财', introduce: '技术部', createTime: '2021-03-17 15:18:23' },
      { id: '6051adb6e93db6522c1d00d3', pid: '6051ad90e93db6522c1d00d2', name: 'Java研发部', code: 'JYFB', manager: '管理员', introduce: 'JAVA研发部', createTime: '2021-03-17 15:18:23' },
      { id: '6051add6e93db6522c1d00d4', pid: '6051ad90e93db6522c1d00d2', name: 'Python研发部', code: 'PYFB', manager: '罗晓晓', introduce: 'Python研发部', createTime: '2021-03-17 15:18:23' },
      { id: '6051adefe93db6522c1d00d5', pid: '6051ad90e93db6522c1d00d2', name: 'Php研发部', code: 'PhpYFB', manager: '孙财', introduce: 'Php研发部', createTime: '2021-03-17 15:18:23' },
      { id: '6051ae03e93db6522c1d00d6', pid: '', name: '运营部', code: 'YYB', manager: '孙财', introduce: '运营部', createTime: '2021-03-17 15:18:23' },
      { id: '6051ae15e93db6522c1d00d7', pid: '', name: '市场部', code: 'SCB', manager: '孙财', introduce: '市场部', createTime: '2021-03-17 15:18:23' },
      { id: '6051ae28e93db6522c1d00d8', pid: '6051ae15e93db6522c1d00d7', name: '北京事业部', code: 'BJSYB', manager: '孙财', introduce: 'BJSYB', createTime: '2021-03-17 15:18:23' },
      { id: '6051ae3de93db6522c1d00d9', pid: '6051ae15e93db6522c1d00d7', name: '上海事业部', code: 'SHSYB', manager: '文吉星', introduce: '上海事业部', createTime: '2021-03-17 15:18:23' },
    ]

    // 转化函数
    const transformToTree = rawData => {
      // 结果数组
      const result = []
      // 映射表
      const map = {}

      // 1.遍历rowData生成映射表
      rawData.forEach(item => {
        item.children = []
        map[item.id] = item
      })
      console.log(map)
      // 2.遍历rowData。
      //   item的pid如果在map中存在,则将该item添加到上级的children中
      //   item的pid如果在map中不存在,则将该item添加到result中
      rawData.forEach(item => {
        // 
        const pid = item.pid
        const obj = map[pid]
        if(obj){
          obj.children.push(item)
        } else {
          result.push(item)
        }
      })
      return result
    }

    const res = transformToTree(rawData)
    console.log(res)