说明:

把后端传过来的平铺数组数据处理为tree组件需要的树形数据

实现效果:

image.png转成: image.png

实现 方式一:

思路:

  1. ** 1.list做第一轮循环:**<br />** (1) 给每一个list中的对象补充 children属性, 直接赋值为空数组**<br />** (2) 建立一个字典(方便后期做查询). {属性名是id : 值就是对象 }**

2.对list做第二轮循环:
根据pid找父子关系

代码演示:

由于方便项目中可以复用,可以单独封装成一个独立的模块 在utils/index.js里面

  1. // 把数组转成数
  2. /**
  3. * 把平铺的数组结构转成树形结构
  4. *
  5. * list = [
  6. * {id:"01", pid:"", "name":"老王" },
  7. * {id:"02", pid:"01", "name":"小张" }
  8. * ]
  9. * 上面的结构说明: 老王是小张的上级
  10. *
  11. * 最后要变成 老王里面多个children属性
  12. *
  13. */
  14. export function tranListToTreeData(list) {
  15. const arr = []
  16. // 1.对list做 第一轮循环:
  17. // (1)给每一个list中的对象补充 children属性, 直接赋值空数组
  18. // (2) 建立一个字典(方便后期做查询). {属性名是id:值就是对象}
  19. const map = {}
  20. list.forEach(item => {
  21. item.children = []
  22. map[item.id] = item
  23. })
  24. console.log('map地图查询..', map)
  25. /**打印结果:
  26. * map:{
  27. * '01':{id:"01", pid:"", "name":"老王" },
  28. * '02':{id:"02", pid:"01", "name":"小张" }
  29. * }
  30. */
  31. // 2.对list做 第二轮循环
  32. // 根据pid找父子关系
  33. list.forEach(item => {
  34. // 对于当前的元素, eg: 对于小张来说
  35. // 如果他的pid对应的元素, 存在 , 说明他是下属, 进入children
  36. // 如果他的pid对应的元素, 不存在 , 说明他不是下属, 是顶级元素,则进入arr
  37. const father = map[item.pid] // 当前item的上级
  38. if (father) {
  39. father.children.push(item) // item就是father的下级
  40. } else { // 找不到上级,说明item就是顶级的元素
  41. arr.push(item)
  42. }
  43. })
  44. return arr
  45. }

解释说明:

注意这个有一个小点:

  1. 就是怎么找下属,也就是当前这个pid和哪一个的id相同,就说明现在这个pid是这个id的下属<br /> 1.首先我们的目的是什么? 我们的目的是把这个平铺的数据变成树形结构,<br /> 我们在经过第一轮的循环,遍历出数组中的每一项,不管他有没有下级,都给它加上一个空的children数组,然后建立一个map字典,方便后面查询所用,但是这个map字典是一个对象,是一个属性名是id,值是对象 的一个字典,<br /> 2. 现在对list做第二轮循环, 是根据pid找父子关系的,这个pid就是找寻上下级关系的一个关键所在,先遍历出每一项, 然后以小张为当前元素item,用map[key]的方式来找当前item的上级,,如果他pid对应的元素存在,那么就说明他是下属,就会进入children,如果他对应的元素不存在,说明他不是下属,是顶级元素,而直接进入arr

实现 方式二: