treeDataHelper.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /**
  2. * Created by Tony on 2017/1/23.
  3. */
  4. const NODE_ID = "ID", P_ID = "ParentID", NEXT_ID = "NextSiblingID", ADHOC_PRE_ID="Previous_ID", CHILDREN_NODE = "items", SUB_ID = "sub_ids", EMPTY_ID_VAL = -1;
  5. var tree_Data_Helper = {
  6. buildTreeNodeDirectly: function(data) {
  7. var me = this, topArr = [], rst = [], tmpNodes = {}, prefix = "id_";
  8. private_getTopNode = function (idArr) {
  9. var rst = null;
  10. for (var i = 0; i < idArr.length; i++) {
  11. if (tmpNodes[prefix + idArr[i]][ADHOC_PRE_ID] == EMPTY_ID_VAL) {
  12. rst = tmpNodes[prefix + idArr[i]];
  13. break;
  14. }
  15. }
  16. return rst;
  17. }
  18. private_buildNodeData = function(parentItem, idArr) {
  19. var iter = [], nextNode = private_getTopNode(idArr);
  20. while (nextNode != null && nextNode != undefined ) {
  21. if (parentItem) {
  22. parentItem[CHILDREN_NODE].push(nextNode);
  23. } else {
  24. rst.push(nextNode);
  25. }
  26. iter.push(nextNode);
  27. nextNode = tmpNodes[prefix + nextNode[NEXT_ID]];
  28. }
  29. for (var i = 0; i < iter.length; i++) {
  30. private_buildNodeData(iter[i], iter[i][SUB_ID]);
  31. }
  32. }
  33. for (var i = 0; i < data.length; i++) {
  34. tmpNodes[prefix + data[i][NODE_ID]] = data[i];
  35. data[i][ADHOC_PRE_ID] = EMPTY_ID_VAL;
  36. data[i][SUB_ID] = [];
  37. data[i][CHILDREN_NODE] = [];
  38. if (data[i][P_ID] == EMPTY_ID_VAL) {
  39. topArr.push(data[i][NODE_ID]);
  40. }
  41. }
  42. for (var i = 0; i < data.length; i++) {
  43. if (data[i][NEXT_ID] != EMPTY_ID_VAL) {
  44. if (tmpNodes[prefix + data[i][NEXT_ID]] !== undefined){
  45. tmpNodes[prefix + data[i][NEXT_ID]][ADHOC_PRE_ID] = data[i][NODE_ID];
  46. }
  47. }
  48. if (data[i][P_ID] != EMPTY_ID_VAL) {
  49. tmpNodes[prefix + data[i][P_ID]][SUB_ID].push(data[i][NODE_ID]);
  50. }
  51. }
  52. private_buildNodeData(null, topArr);
  53. //try to release and return
  54. tmpNodes = null;
  55. topArr.length = 0;
  56. return rst;
  57. },
  58. reSettleRelatedID: function(treeData) {
  59. if (treeData && treeData.length > 0) {
  60. for (var i = 0; i < treeData[CHILDREN_NODE].length; i++) {
  61. var nI = null;
  62. if (i < treeData[CHILDREN_NODE].length - 1) {
  63. nI = treeData[CHILDREN_NODE][i+1];
  64. }
  65. settleNodeRelatedID(null, nI, treeData[CHILDREN_NODE][i]);
  66. }
  67. }
  68. },
  69. settleNodeRelatedID : function(parentItem, nextItem, node) {
  70. if (parentItem) {
  71. node[P_ID] = parentItem[NODE_ID];
  72. } else {
  73. node[P_ID] = EMPTY_ID_VAL;
  74. }
  75. if (nextItem) {
  76. node[NEXT_ID] = nextItem[NODE_ID];
  77. } else {
  78. node[NEXT_ID] = EMPTY_ID_VAL;
  79. }
  80. for (var i = 0; i < node[CHILDREN_NODE].length; i++) {
  81. var nI = null;
  82. if (i < node[CHILDREN_NODE].length - 1) {
  83. nI = node[CHILDREN_NODE][i+1];
  84. }
  85. private_settleNodeRelatedID(node, nI, node[CHILDREN_NODE][i]);
  86. }
  87. }
  88. }