treeDataHelper.js 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. tmpNodes[prefix + data[i][NEXT_ID]][ADHOC_PRE_ID] = data[i][NODE_ID];
  45. }
  46. if (data[i][P_ID] != EMPTY_ID_VAL) {
  47. tmpNodes[prefix + data[i][P_ID]][SUB_ID].push(data[i][NODE_ID]);
  48. }
  49. }
  50. private_buildNodeData(null, topArr);
  51. //try to release and return
  52. tmpNodes = null;
  53. topArr.length = 0;
  54. return rst;
  55. },
  56. reSettleRelatedID: function(treeData) {
  57. if (treeData && treeData.length > 0) {
  58. for (var i = 0; i < treeData[CHILDREN_NODE].length; i++) {
  59. var nI = null;
  60. if (i < treeData[CHILDREN_NODE].length - 1) {
  61. nI = treeData[CHILDREN_NODE][i+1];
  62. }
  63. settleNodeRelatedID(null, nI, treeData[CHILDREN_NODE][i]);
  64. }
  65. }
  66. },
  67. settleNodeRelatedID : function(parentItem, nextItem, node) {
  68. if (parentItem) {
  69. node[P_ID] = parentItem[NODE_ID];
  70. } else {
  71. node[P_ID] = EMPTY_ID_VAL;
  72. }
  73. if (nextItem) {
  74. node[NEXT_ID] = nextItem[NODE_ID];
  75. } else {
  76. node[NEXT_ID] = EMPTY_ID_VAL;
  77. }
  78. for (var i = 0; i < node[CHILDREN_NODE].length; i++) {
  79. var nI = null;
  80. if (i < node[CHILDREN_NODE].length - 1) {
  81. nI = node[CHILDREN_NODE][i+1];
  82. }
  83. private_settleNodeRelatedID(node, nI, node[CHILDREN_NODE][i]);
  84. }
  85. }
  86. }