tree.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. } else {
  49. r.push(sNodes[j])
  50. }
  51. }
  52. return r
  53. } else {
  54. return [sNodes]
  55. }
  56. },
  57. /**
  58. * 转换成树结构 并设置了层级
  59. * @param {*} data 数据
  60. */
  61. transformToTreeAndLevelFormat: function(data, setting = {}) {
  62. setting = defaultsDeep({}, setting, defaultSetting)
  63. const node = treeUtil.transformToTreeFormat(data, setting)
  64. // 设置层级
  65. for (let i = 0; i < node.length; i++) {
  66. treeUtil.setSonNodeLevel(null, node[i], setting)
  67. }
  68. return node
  69. },
  70. /**
  71. * 树形转换成数组结构
  72. *
  73. */
  74. transformToArrayFormat: function(data, setting = {}) {
  75. if (!data) return []
  76. function _do(_node) {
  77. r.push(_node)
  78. const children = treeUtil.nodeChildren(_node, setting)
  79. if (children) {
  80. r = r.concat(treeUtil.transformToArrayFormat(children, setting))
  81. }
  82. }
  83. const nodes = JSON.parse(JSON.stringify(data))
  84. setting = defaultsDeep({}, setting, defaultSetting)
  85. let r = []
  86. if (nodes instanceof Array) {
  87. for (let i = 0, l = nodes.length; i < l; i++) {
  88. const node = nodes[i]
  89. _do(node)
  90. }
  91. } else {
  92. _do(nodes)
  93. }
  94. return r
  95. },
  96. nodeChildren: function(node, setting, newChildren) {
  97. if (!node) {
  98. return null
  99. }
  100. const key = setting.childrenKey
  101. if (typeof newChildren !== 'undefined') {
  102. node[key] = newChildren
  103. }
  104. return node[key]
  105. },
  106. /**
  107. * 设置儿子节点等级
  108. * @param {*} parentNode
  109. * @param {*} node
  110. */
  111. setSonNodeLevel: function(parentNode, node, setting) {
  112. if (!node) return
  113. const childrenKey = setting.childrenKey
  114. const levelKey = setting.levelKey
  115. node[levelKey] = parentNode ? parentNode[levelKey] + 1 : 0
  116. if (!node[childrenKey]) { return }
  117. for (let i = 0, l = node[childrenKey].length; i < l; i++) {
  118. if (node[childrenKey][i]) { treeUtil.setSonNodeLevel(node, node[childrenKey][i], setting) }
  119. }
  120. }
  121. }
  122. export default treeUtil