treeUtil.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. 'use strict';
  2. /**
  3. * Created by Tony on 2017/3/14.
  4. */
  5. const NODE_ID = 'ledger_id';
  6. const P_ID = 'ledger_pid';
  7. const NEXT_ID = 'NextSiblingID';
  8. const ADHOC_PRE_ID = 'Previous_ID';
  9. const ORDER_ID = 'order';
  10. const CHILDREN_NODE = 'items';
  11. const SUB_ID = 'sub_ids';
  12. const EMPTY_ID_VAL = -1;
  13. const TREE_LEVEL = 'treeLevel';
  14. const TOP_BILL_ID = 'topBillID';
  15. const TREE_FLAT_SERIAL_ORDER = 'treeFlatSerialOrder';
  16. function sortOder(item1, item2) {
  17. return parseInt(item1[ORDER_ID]) - parseInt(item2[ORDER_ID]);
  18. }
  19. const tree_Data_Helper = {
  20. buildTreeNodeDirectly: function(data, addLevel) {
  21. const topArr = [];
  22. const rst = [];
  23. const nodeCache = {};
  24. const prefix = 'id_';
  25. const private_buildNodeData = function(node, treeLevel, tbID) {
  26. const stbID = (tbID === -1) ? node[NODE_ID] : tbID;
  27. node[TOP_BILL_ID] = stbID;
  28. if (addLevel) {
  29. node[TREE_LEVEL] = treeLevel;
  30. }
  31. if (node[CHILDREN_NODE].length > 0) {
  32. node[CHILDREN_NODE].sort(sortOder);
  33. for (const subNode of node[CHILDREN_NODE]) {
  34. private_buildNodeData(subNode, treeLevel + 1, tbID);
  35. }
  36. }
  37. };
  38. // 1. 给每个节点设置key, 顺便找Top Node
  39. for (let i = 0; i < data.length; i++) {
  40. nodeCache[prefix + data[i][NODE_ID]] = data[i];
  41. data[i][CHILDREN_NODE] = [];
  42. if (parseInt(data[i][P_ID]) === EMPTY_ID_VAL) {
  43. topArr.push(data[i]);
  44. }
  45. }
  46. // 2. 通过key,设置父子关系,然后通过order来排序
  47. for (let psi = 0; psi < data.length; psi++) {
  48. if (parseInt(data[psi][P_ID]) !== EMPTY_ID_VAL) {
  49. const pNode = nodeCache[prefix + data[psi][P_ID]];
  50. if (pNode) {
  51. pNode[CHILDREN_NODE].push(data[psi]);
  52. } else {
  53. console.log('warning: no parent node was found!');
  54. }
  55. }
  56. }
  57. // 3. 开build
  58. topArr.sort(sortOder);
  59. for (const topNode of topArr) {
  60. private_buildNodeData(topNode, 0, -1);
  61. }
  62. // try to release and return
  63. // nodeCache = null;
  64. topArr.length = 0;
  65. return rst;
  66. },
  67. getFlatArray: function(srcArr, destArr, addSerialOrder) {
  68. let serialStartOrder = 0;
  69. const private_put = function(parentItem) {
  70. if (addSerialOrder) {
  71. parentItem[TREE_FLAT_SERIAL_ORDER] = serialStartOrder;
  72. serialStartOrder++;
  73. // 说明:当清单通过树排序后,为了后续的排序方便,有必要加这个序号,并作为指标提供
  74. }
  75. destArr.push(parentItem);
  76. if (parentItem[CHILDREN_NODE]) {
  77. for (const subItem of parentItem[CHILDREN_NODE]) {
  78. private_put(subItem);
  79. }
  80. }
  81. }
  82. for (const node of srcArr) {
  83. private_put(node);
  84. }
  85. for (const item of destArr) {
  86. delete item[CHILDREN_NODE];
  87. }
  88. },
  89. };
  90. module.exports = tree_Data_Helper;