tree.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /**
  2. * 树操作工具类</br>
  3. * Array转换Tree
  4. * <pre>
  5. * 作者:hugh zhuang
  6. * 邮箱:3378340995@qq.com
  7. * 日期:2018-07-02-下午3:29:34
  8. * 版权:广州流辰信息技术有限公司
  9. * </pre>
  10. */
  11. import { defaultsDeep } from 'lodash'
  12. const defaultSetting = {
  13. isParent: 'isParent',
  14. childrenKey: 'children',
  15. nameKey: 'name',
  16. titleKey: 'title',
  17. idKey: 'id',
  18. pIdKey: 'parentId',
  19. levelKey: 'level',
  20. rootPId: null
  21. }
  22. const treeUtil = {
  23. /**
  24. * 转换成树形结构
  25. * @param {*} data 数据
  26. * @param {*} setting 设置
  27. */
  28. transformToTreeFormat: function (data, setting = {}) {
  29. const sNodes = JSON.parse(JSON.stringify(data))
  30. setting = defaultsDeep({}, setting, defaultSetting)
  31. const idKey = setting.idKey
  32. const pIdKey = setting.pIdKey
  33. const childrenKey = setting.childrenKey
  34. let i, j, l
  35. if (!idKey || idKey === '' || !sNodes) { return [] }
  36. if (sNodes instanceof Array) {
  37. const r = []
  38. const tmpMap = []
  39. for (i = 0, l = sNodes.length; i < l; i++) {
  40. tmpMap[sNodes[i][idKey]] = sNodes[i]
  41. }
  42. for (j = 0, l = sNodes.length; j < l; j++) {
  43. if (tmpMap[sNodes[j][pIdKey]] && sNodes[j][idKey] !== sNodes[j][pIdKey]) {
  44. if (!tmpMap[sNodes[j][pIdKey]][childrenKey]) {
  45. tmpMap[sNodes[j][pIdKey]][childrenKey] = []
  46. }
  47. tmpMap[sNodes[j][pIdKey]][childrenKey].push(sNodes[j])
  48. if (sNodes[j].subs && sNodes[j].subs.length) {
  49. if (!tmpMap[sNodes[j][idKey]][childrenKey]) {
  50. tmpMap[sNodes[j][idKey]][childrenKey] = []
  51. }
  52. tmpMap[sNodes[j][idKey]][childrenKey].push(...sNodes[j].subs)
  53. // tmpMap[sNodes[j][idKey]][childrenKey] = sNodes[j].subs
  54. }
  55. } else {
  56. r.push(sNodes[j])
  57. }
  58. }
  59. return r
  60. } else {
  61. return [sNodes]
  62. }
  63. },
  64. /**
  65. * 转换成树结构 并设置了层级
  66. * @param {*} data 数据
  67. */
  68. transformToTreeAndLevelFormat: function (data, setting = {}) {
  69. setting = defaultsDeep({}, setting, defaultSetting)
  70. const node = treeUtil.transformToTreeFormat(data, setting)
  71. // 设置层级
  72. for (let i = 0; i < node.length; i++) {
  73. treeUtil.setSonNodeLevel(null, node[i], setting)
  74. }
  75. return node
  76. },
  77. /**
  78. * 树形转换成数组结构
  79. */
  80. transformToArrayFormat: function (data, setting = {}) {
  81. if (!data) return []
  82. function _do (_node) {
  83. r.push(_node)
  84. const children = treeUtil.nodeChildren(_node, setting)
  85. if (children) {
  86. r = r.concat(treeUtil.transformToArrayFormat(children, setting))
  87. }
  88. }
  89. const nodes = JSON.parse(JSON.stringify(data))
  90. setting = defaultsDeep({}, setting, defaultSetting)
  91. let r = []
  92. if (nodes instanceof Array) {
  93. for (let i = 0, l = nodes.length; i < l; i++) {
  94. const node = nodes[i]
  95. _do(node)
  96. }
  97. } else {
  98. _do(nodes)
  99. }
  100. return r
  101. },
  102. nodeChildren: function (node, setting, newChildren) {
  103. if (!node) {
  104. return null
  105. }
  106. const key = setting.childrenKey
  107. if (typeof newChildren !== 'undefined') {
  108. node[key] = newChildren
  109. }
  110. return node[key]
  111. },
  112. /**
  113. * 设置儿子节点等级
  114. * @param {*} parentNode
  115. * @param {*} node
  116. */
  117. setSonNodeLevel: function (parentNode, node, setting) {
  118. if (!node) return
  119. const childrenKey = setting.childrenKey
  120. const levelKey = setting.levelKey
  121. node[levelKey] = parentNode ? parentNode[levelKey] + 1 : 0
  122. if (!node[childrenKey]) { return }
  123. for (let i = 0, l = node[childrenKey].length; i < l; i++) {
  124. if (node[childrenKey][i]) { treeUtil.setSonNodeLevel(node, node[childrenKey][i], setting) }
  125. }
  126. }
  127. }
  128. export default treeUtil