testMyTree.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /**
  2. * Created by vian on 2017/3/31.
  3. */
  4. var test = require("tape");
  5. test("testMyBillsTree:", function(t){
  6. var billsData = [
  7. {ID: 2, ParentID: -1, NextSiblingID: 3},
  8. {ID: 1, ParentID: -1, NextSiblingID: 2},
  9. {ID: 3, ParentID: -1, NextSiblingID: 9},
  10. {ID: 4, ParentID: 3, NextSiblingID: 5},
  11. {ID: 5, ParentID: 3, NextSiblingID: -1},
  12. {ID: 6, ParentID: 4, NextSiblingID: 7},
  13. {ID: 7, ParentID: 4, NextSiblingID: -1},
  14. {ID: 8, ParentID: 6, NextSiblingID: -1},
  15. {ID: 10, ParentID: -1, NextSiblingID: -1},
  16. {ID: 9, ParentID: -1, NextSiblingID: 10},
  17. {ID: 11, ParentID: 10, NextSiblingID: -1},
  18. {ID: 12, ParentID: 11, NextSiblingID: -1},
  19. {ID: 13, ParentID: 12, NextSiblingID: -1},
  20. {ID: 14, ParentID: 13, NextSiblingID: -1},
  21. {ID: 15, ParentID: 14, NextSiblingID: 16},
  22. {ID: 16, ParentID: 14, NextSiblingID: 17},
  23. {ID: 17, ParentID: 14, NextSiblingID: -1},
  24. {ID: 18, ParentID: 17, NextSiblingID: 19},
  25. {ID: 19, ParentID: 17, NextSiblingID: -1},
  26. {ID: 20, ParentID: 1, NextSiblingID: -1},
  27. ]
  28. function getTop(data, topId){
  29. var top = [];
  30. for(var i=0; i<data.length; i++){
  31. if(data[i].ParentID == -1 ||data[i].ParentID == topId){
  32. top.push(data[i]);
  33. }
  34. }
  35. return top;
  36. }
  37. function sortNodes(nodes){
  38. for(var i=0; i<nodes.length; i++){
  39. for(var j=i+1; j<nodes.length; j++){
  40. var temp;
  41. if(nodes[i].NextSiblingID == nodes[j].ID){
  42. temp = nodes[i+1];
  43. nodes[i+1] = nodes[j];
  44. nodes[j] = temp;
  45. }
  46. }
  47. if(nodes[i].NextSiblingID == nodes[0].ID){
  48. var topNode = nodes[i];
  49. for(var j=nodes.length-2; j>=0; j-- ){
  50. nodes[j+1] = nodes[j];
  51. }
  52. nodes[0] = topNode;
  53. }
  54. }
  55. return nodes;
  56. }
  57. function getNodeChildren(node, children){
  58. for(var i=0; i<billsData.length; i++){
  59. if(billsData[i].ParentID == node.ID){
  60. children.push(billsData[i].ID);
  61. getNodeChildren(billsData[i], children);
  62. }
  63. }
  64. return children;
  65. }
  66. function buildChildren(billsData){
  67. var tempTree = [];
  68. for(var i=0; i<billsData.length; i++){
  69. var children = [];
  70. getNodeChildren(billsData[i], children);
  71. tempTree.push({"ID": billsData[i].ID, "ParentID": billsData[i].ParentID, "NextSiblingID": billsData[i].NextSiblingID, "children": children});
  72. }
  73. return tempTree;
  74. }
  75. function getNodes(data ,ids){
  76. var idsNodes = [];
  77. for(var i =0; i<ids.length; i++){
  78. for(var j=0 ; j<data.length; j++){
  79. if(ids[i] == data[j].ID){
  80. idsNodes.push({ID: data[j].ID, ParentID: data[j].ParentID, NextSiblingID: data[j].NextSiblingID, children: data[j].children});
  81. }
  82. }
  83. }
  84. return idsNodes;
  85. }
  86. function buildTree(treeContainer, billsData, tempTree, topId){
  87. var sortTempTree = sortNodes(getTop(tempTree, topId));
  88. for(var i=0; i<sortTempTree.length; i++){
  89. if(sortTempTree[i].children.length > 0){
  90. treeContainer.push({"ID": sortTempTree[i].ID, "ParentID": sortTempTree[i].ParentID, "NextSiblingID": sortTempTree[i].NextSiblingID, "children": sortTempTree[i].children});
  91. var childrenTree = getNodes(buildChildren(billsData), sortTempTree[i].children);
  92. buildTree(treeContainer, billsData, childrenTree, sortTempTree[i].ID);
  93. }
  94. else {
  95. treeContainer.push({"ID": sortTempTree[i].ID, "ParentID": sortTempTree[i].ParentID, "NextSiblingID": sortTempTree[i].NextSiblingID, "children": sortTempTree[i].children});
  96. }
  97. }
  98. return treeContainer;
  99. }
  100. //console.log("sortNodes:====================");
  101. //console.log(sortNodes(getTop(buildChildren(billsData))));
  102. // console.log("buildChildren:====================");
  103. // console.log(buildChildren(billsData));
  104. console.log("buildTree:====================");
  105. var billsTree = [];
  106. console.log(buildTree(billsTree, billsData, buildChildren(billsData), -1));
  107. t.end();
  108. });