递归重组企业微信(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)