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.

146 lines
4.5 KiB

3 months ago
2 years ago
3 months ago
3 months 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.unshift(treeNode[lpidName]);
  47. pids = [].concat(getTreePids(tree, lchildNodeName, lpidName, lidName, treeNode[lpidName]),pids)
  48. // getTreePids(tree, lchildNodeName, lpidName, lidName, treeNode[lpidName]).forEach(e => {
  49. // pids.unshift(e);
  50. // });
  51. }
  52. return pids;
  53. }
  54. //通过node值,找出所有子节点值
  55. function getTreeAllChildIdsByNode(treeNode, childNodeName, idName) {
  56. let childIds = [];
  57. let lchildNodeName = childNodeName || 'children';
  58. let lidName = idName || 'id';
  59. if (!treeNode) return [];
  60. if (!treeNode[lchildNodeName] || treeNode[lchildNodeName].length < 1) return [];
  61. treeNode[lchildNodeName].forEach(e => {
  62. childIds.push(e[lidName]);
  63. getTreeAllChildIdsByNode(e, lchildNodeName, lidName).forEach(e2 => {
  64. childIds.push(e2);
  65. });
  66. });
  67. return childIds;
  68. }
  69. //通过ID值,找出所有子节点值
  70. function getTreeAllChildIdsById(tree, childNodeName, idName, idVal) {
  71. let childIds = [], treeNode = null;
  72. let lchildNodeName = childNodeName || 'children';
  73. let lidName = idName || 'id';
  74. if (!tree || tree.length < 1) return [];
  75. treeNode = getTreeNode(tree, lchildNodeName, lidName, idVal);
  76. childIds = getTreeAllChildIdsByNode(treeNode, lchildNodeName, lidName);
  77. return childIds;
  78. }
  79. //获取节点本身
  80. function getTreeNode(tree, childNodeName, idName, idVal) {
  81. let treeNode = null;
  82. let lchildNodeName = childNodeName || 'children';
  83. let lidName = idName || 'id';
  84. if (!tree || tree.length < 1) return treeNode;
  85. for (let i = 0; i < tree.length; i++) {
  86. if (tree[i][lidName] == idVal) {
  87. treeNode = tree[i];
  88. break;
  89. } else {
  90. if (tree[i][lchildNodeName] && tree[i][lchildNodeName].length > 0) {
  91. treeNode = getTreeNode(tree[i][lchildNodeName], lchildNodeName, lidName, idVal);
  92. }
  93. if (treeNode) break;
  94. }
  95. }
  96. return treeNode;
  97. }
  98. // 根节点找到,则包含子级点, 子节点找到,则只包含上级节点
  99. function filterTreeNode(treeData, childNodeName, keys, vals) {
  100. let newTree = []
  101. let find = false
  102. if (Array.isArray(treeData) && treeData.length > 0) {
  103. treeData.forEach(e => {
  104. find = false
  105. keys.forEach((key, i) => {
  106. if (e[key].indexOf(vals[i]) > -1) find = true
  107. });
  108. // 当前级找到
  109. if (find) {
  110. newTree.push(e)
  111. } else {
  112. let childTree = filterTreeNode(e[childNodeName], childNodeName, keys, vals)
  113. if (childTree.length > 0) {
  114. let temp = deepCopy(e)
  115. temp[childNodeName] = childTree
  116. newTree.push(temp)
  117. }
  118. }
  119. });
  120. }
  121. return newTree
  122. }
  123. module.exports = {
  124. madeTree,
  125. getTreePids, getTreeAllChildIdsByNode, getTreeAllChildIdsById, getTreeNode,filterTreeNode,
  126. }