制作Tree 树形控件,平铺数据转树形数据
敲黑板!!敲黑板!!
问题:后端给我们的数据确实平铺的数组结构该怎么办?
办法1:把后端 打 一顿然后然他重新写。
办法2 :打 不过自己写
平铺数组结构: const arr = [ { id: 29, pid: , name: 总裁办 }, { id: 2c, pid: , name: 财务部 }, { id: 2d, pid: 2c, name: 财务核算部}, { id: 2f, pid: 2c, name: 薪资管理部}, { id: d2, pid: , name: 技术部}, { id: d3, pid: d2, name: Java研发部} ] Tree 树形控件需要的树状结构: const arr1 = [ { id: 29, pid: , name: 总裁办,children: [] }, { id: 2c, pid: , name: 财务部, children:[ { id: 2d, pid: 2c, name: 财务核算部,children: []}, { id: 2f, pid: 2c, name: 薪资管理部,children: []}, ] }, { id: d2, pid: , name: 技术部, children: [ { id: d3, pid: d2, name: Java研发部,children: []} ]}, ]
把平铺数组结构处理为树状结构
1.1.使用非递归方法 (我这里是封装好的复制可以直接使用)
/** * 把平铺的数组结构转成树形结构 * * [ * {id:"01", pid:"", "name":"老王" }, * {id:"02", pid:"01", "name":"小张" } * ] * 上面的结构说明: 老王是小张的上级 */ export function tranListToTreeData(list) { // 1. 定义两个变量 const treeList = [], map = {} // 2. 建立一个映射关系,并给每个元素补充children属性. // 映射关系: 目的是让我们能通过id快速找到对应的元素 // 补充children:让后边的计算更方便 list.forEach(item => { if (!item.children) { item.children = [] } map[item.id] = item }) // 循环 list.forEach(item => { // 对于每一个元素来说,先找它的上级 // 如果能找到,说明它有上级,则要把它添加到上级的children中去 // 如果找不到,说明它没有上级,直接添加到 treeList const parent = map[item.pid] // 如果存在上级则表示item不是最顶层的数据 if (parent) { parent.children.push(item) } else { // 如果不存在上级 则是顶层数据,直接添加 treeList.push(item) } }) // 返回 return treeList }
1.2.使用递归方法
// * 数组转树 递归求解 // */ function toTree(list,pid = ){ let treeList = [] treeList = list.filter(item => { return item.pid === pid }) treeList.forEach(item=>{ item.childen=toTree(list,item.id) }) return treeList }
3.使用封装的函数(选择一个使用即可)
async loadDepartments() { const res = await getDepartments() console.log(res) // 调用封装的转换函数 this.list = tranListToTreeData(res.data.depts) // this.list = toTreeres.data.depts) }