You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
4.3 KiB

3 months ago
2 years ago
3 months ago
  1. //树对象相关操作 目前只支持单主键操作
  2. const { deepCopy } = require("./proFunc");
  3. //将list数据,生成tree
  4. // dataSource:列表数据资源
  5. // childNodeName:子节点名称
  6. // pidName:父ID列名
  7. // idName:id列名
  8. // pidVal:父id初始值
  9. function madeTree(dataSource, childNodeName, pidName, idName, pidVal) {
  10. if (!dataSource || dataSource.length < 1) return [];
  11. let trees = []
  12. let lchildNodeName = childNodeName || 'children';
  13. let lpidName = pidName || 'pid';
  14. let lidName = idName || 'id';
  15. dataSource.forEach(e => {
  16. let tree = {}, ret = null;
  17. if (pidVal) { //根节点有具体的值
  18. if (e[lpidName] == pidVal) {
  19. tree = e;
  20. ret = madeTree(dataSource, lchildNodeName, lpidName, lidName, e[lidName]);
  21. if (ret && ret.length > 0) tree[lchildNodeName] = ret;
  22. trees.push(tree);
  23. }
  24. } else {
  25. if (!e[lpidName]) { //根节点为0,空或null
  26. tree = e;
  27. ret = madeTree(dataSource, lchildNodeName, lpidName, lidName, e[lidName]);
  28. if (ret && ret.length > 0) tree[lchildNodeName] = ret;
  29. trees.push(tree);
  30. }
  31. }
  32. })
  33. return trees;
  34. }
  35. //通过ID值,找出所有父节点值
  36. function getTreePids(tree, childNodeName, pidName, idName, idVal) {
  37. let pids = [], treeNode = null;
  38. if (!tree || tree.length < 1) return [];
  39. if (!idVal) return [];
  40. let lchildNodeName = childNodeName || 'children';
  41. let lpidName = pidName || 'pid';
  42. let lidName = idName || 'id';
  43. treeNode = getTreeNode(tree, lchildNodeName, lidName, idVal);
  44. //console.log('treeNode',treeNode);
  45. if (treeNode) {
  46. pids.push(treeNode[lpidName]);
  47. getTreePids(tree, lchildNodeName, lpidName, lidName, treeNode[lpidName]).forEach(e => {
  48. pids.unshift(e);
  49. });
  50. }
  51. return pids;
  52. }
  53. //通过node值,找出所有子节点值
  54. function getTreeAllChildIdsByNode(treeNode, childNodeName, idName) {
  55. let childIds = [];
  56. let lchildNodeName = childNodeName || 'children';
  57. let lidName = idName || 'id';
  58. if (!treeNode) return [];
  59. if (!treeNode[lchildNodeName] || treeNode[lchildNodeName].length < 1) return [];
  60. treeNode[lchildNodeName].forEach(e => {
  61. childIds.push(e[lidName]);
  62. getTreeAllChildIdsByNode(e, lchildNodeName, lidName).forEach(e2 => {
  63. childIds.push(e2);
  64. });
  65. });
  66. return childIds;
  67. }
  68. //通过ID值,找出所有子节点值
  69. function getTreeAllChildIdsById(tree, childNodeName, idName, idVal) {
  70. let childIds = [], treeNode = null;
  71. let lchildNodeName = childNodeName || 'children';
  72. let lidName = idName || 'id';
  73. if (!tree || tree.length < 1) return [];
  74. treeNode = getTreeNode(tree, lchildNodeName, lidName, idVal);
  75. childIds = getTreeAllChildIdsByNode(treeNode, lchildNodeName, lidName);
  76. return childIds;
  77. }
  78. //获取节点本身
  79. function getTreeNode(tree, childNodeName, idName, idVal) {
  80. let treeNode = null;
  81. let lchildNodeName = childNodeName || 'children';
  82. let lidName = idName || 'id';
  83. if (!tree || tree.length < 1) return treeNode;
  84. for (let i = 0; i < tree.length; i++) {
  85. if (tree[i][lidName] == idVal) {
  86. treeNode = tree[i];
  87. break;
  88. } else {
  89. if (tree[i][lchildNodeName] && tree[i][lchildNodeName].length > 0) {
  90. treeNode = getTreeNode(tree[i][lchildNodeName], lchildNodeName, lidName, idVal);
  91. }
  92. if (treeNode) break;
  93. }
  94. }
  95. return treeNode;
  96. }
  97. // 根节点找到,则包含子级点, 子节点找到,则只包含上级节点
  98. function filterTreeNode(treeData, childNodeName, keys, vals) {
  99. let newTree = []
  100. let find = false
  101. if (Array.isArray(treeData) && treeData.length > 0) {
  102. treeData.forEach(e => {
  103. find = false
  104. keys.forEach((key, i) => {
  105. if (e[key].indexOf(vals[i]) > -1) find = true
  106. });
  107. // 当前级找到
  108. if (find) {
  109. newTree.push(e)
  110. } else {
  111. let childTree = filterTreeNode(e[childNodeName], childNodeName, keys, vals)
  112. if (childTree.length > 0) {
  113. let temp = deepCopy(e)
  114. temp[childNodeName] = childTree
  115. newTree.push(temp)
  116. }
  117. }
  118. });
  119. }
  120. return newTree
  121. }
  122. module.exports = {
  123. madeTree,
  124. getTreePids, getTreeAllChildIdsByNode, getTreeAllChildIdsById, getTreeNode,filterTreeNode,
  125. }