递归重组企业微信(wecom)组织架构&el-cascader回显

const allotDeparment = (
  departments,
  parentDepartmentsList,
  usersObj,
  parentId,
  deparmentsNames
) => {
  const otherD = []
  // 现将每组的人员推入对应的部门
  if (usersObj[parentId]) {
    parentDepartmentsList.push(...usersObj[parentId])
  }
  // 循环遍历部门,进行重构
  departments.forEach(deparmentInfo => {
    if (deparmentInfo.parentid === parentId) {
      parentDepartmentsList.push({
        label: deparmentInfo.name,
        value: deparmentInfo.id,
        parentid: deparmentInfo.parentid,
        children: []
      })
    } else {
      otherD.push(deparmentInfo)
    }
  })
  if (otherD.length > 0) {
    // 递归获取下一级的数据
    parentDepartmentsList.forEach(parentD => {
      if (parentD.children) {
        allotDeparment(otherD, parentD.children, usersObj, parentD.value)
      }
    })
  }
}

调用

allotDeparment(departments, personList, departmentUsersObj, 0)

改良:

  const departmentUsersObj = {}
  // eslint-disable-next-line no-unused-expressions
  persondata.data?.userlist?.forEach(element => {
    // 将所有人员按照部门id进行重新分配
    if (element.department?.length > 0) {
      element.department.forEach(d => {
        if (departmentUsersObj[d]) {
          departmentUsersObj[d].push({ label: element.name, value: element.userid })
        } else {
          departmentUsersObj[d] = []
          departmentUsersObj[d].push({ label: element.name, value: element.userid })
        }
      })
    }
  })

  const reconstructDepartmentsData = (departmensList, departmentUsersObj) => {
  const personList = [] // 最终要返回的结果
  const rootParentId = 0 // 初始化开始层级为0,定义全局层级
  const allotDeparment = (departments, parentDepartmentsList, usersObj, parentId) => {
    const otherD = []
    // 现将每组的人员推入对应的部门
    if (usersObj[parentId]) {
      parentDepartmentsList.push(...usersObj[parentId])
    }
    // 循环遍历部门,进行重构
    departments.forEach(deparmentInfo => {
      if (deparmentInfo.parentid === parentId) {
        parentDepartmentsList.push({
          label: deparmentInfo.name,
          value: deparmentInfo.id,
          parentid: deparmentInfo.parentid,
          children: []
        })
      } else {
        otherD.push(deparmentInfo)
      }
    })
    if (otherD.length > 0) {
      // 递归获取下一级的数据
      parentDepartmentsList.forEach(parentD => {
        if (parentD.children) {
          allotDeparment(otherD, parentD.children, usersObj, parentD.value)
        }
      })
    }
  }
  allotDeparment(departmensList, personList, departmentUsersObj, rootParentId)
  return personList
}

调用

const personList = reconstructDepartmentsData(departments, departmentUsersObj)
  const getAuthorArrById = (authorId, departmentUsersTree) => {
  // 闭包进行递归操作
  const preResultarr = [] // 在找到目标后,递归时操作的数组
  let resultArr = [] // 最终结果的数组
  let depth = 0 // 初始化开始层级为0,定义全局层级
  // 定义递归函数
  function childrenEach (childrenData, depthN) {
    // 处理当前层级的所有组
    for (var j = 0; j < childrenData.length; j++) {
      // 每次只处理一个层级中的一个数据。
      depth = depthN // 将执行的层级赋值 到 全局层级
      preResultarr[depthN] = childrenData[j].value // 将第一级的id留下
      if (childrenData[j].value === authorId) {
        resultArr = preResultarr.slice(0, depthN + 1) // 将目前匹配的数组,截断并保存到结果数组,
        // 第一次找到就直接结束循环,然后退出
        break
      } else {
        if (childrenData[j].children) {
          depth++
          childrenEach(childrenData[j].children, depth)
        }
      }
    }
    return resultArr
  }
  return childrenEach(departmentUsersTree, depth)
}

回显调用

const userArrSelected = getAuthorArrById('xxx', personList)
posted @ 2022-06-13 09:01  CoderI  阅读(104)  评论(0编辑  收藏  举报