Advertisement
webdwall

Printing menu items using recursion

Dec 1st, 2013
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <script>
  2. /*
  3.  * the problem: we have a random list of menu items with multiple level of heirarchy.
  4.  * we want the items to be printed into the desired order
  5. */
  6.  
  7. /* ordered properly just for understanding, this array is shuffled and made random before using */
  8. var items = [
  9.     {id: 1,     parent: 0,  order: 2,   title: 'Main Course'},
  10.         {id: 4,     parent: 1,  order: 3,   title: 'Mughlai'},
  11.         {id: 5,     parent: 1,  order: 1,   title: 'Chinese'},
  12.         {id: 6,     parent: 1,  order: 2,   title: 'Italian'},
  13.             {id: 16,    parent: 6,  order: 3, title: 'Italian 3'},
  14.             {id: 17,    parent: 6,  order: 2, title: 'Italian 2 (Pasta)'},
  15.                 {id: 19,    parent: 17,     order: 1,   title: 'Pasta 1'},
  16.                 {id: 20,    parent: 17,     order: 2,   title: 'Pasta 2'},
  17.  
  18.             {id: 18,    parent: 6,  order: 1, title: 'Italian 1'},
  19.  
  20.         {id: 77,     parent: 1,  order: 4,   title: 'Punjabi'},
  21.             {id: 21,    parent: 77,  order: 1,   title: 'Tandoori'},
  22.                 {id: 27,    parent: 21,     order: 1,   title: 'Tandoori 1'},
  23.                 {id: 26,    parent: 21,     order: 2,   title: 'Tandoori 1'},
  24.  
  25.             {id: 22,    parent: 77,  order: 2,   title: 'Naan'},
  26.             {id: 23,    parent: 77,  order: 3,   title: 'Tawa'},
  27.                 {id: 24,    parent: 23,     order: 2,   title: 'Tawa2'},
  28.                 {id: 25,    parent: 23,     order: 1,   title: 'Tawa1'},
  29.  
  30.     {id: 2,     parent: 0,  order: 1,   title: 'Apetizers'},
  31.         {id: 7,     parent: 2,  order: 1,    title: 'apetizer1'},
  32.         {id: 8,     parent: 2,  order: 2,    title: 'apetizer2'},
  33.         {id: 9,     parent: 2,  order: 3,    title: 'apetizer3'},
  34.  
  35.     {id: 3,     parent: 0,  order: 3,   title: 'Desserts'},
  36.         {id: 11,    parent: 3,  order: 2,    title: 'Pudding'},
  37.             {id: 14,    parent: 11,  order: 2,    title: 'Pudding 2'},
  38.             {id: 15,    parent: 11,  order: 1,    title: 'Pudding 1'},
  39.                    
  40.         {id: 10,    parent: 3,  order: 1,    title: 'Icecreams'},
  41.             {id: 12,    parent: 10,  order: 1,    title: 'Icecream 1'},
  42.             {id: 13,    parent: 10,  order: 2,    title: 'Icecream 2'},
  43. ];
  44.  
  45. /* desired output
  46. Apetizers
  47.     - apetizer1
  48.     - apetizer2
  49.     - apetizer3
  50. Main Course
  51.     - Chinese
  52.     - Italian
  53.         - Italian 1
  54.         - Italian 2 (Pasta)
  55.             - Pasta 1
  56.             - Pasta 2
  57.         - Italian 3
  58.     - Mughlai
  59.     - Punjabi
  60.         - Tandoori
  61.             - Tandoori 1
  62.             - Tandoori 2
  63.         - Naan
  64.         - Tawa
  65.             - Tawa1
  66.             - Tawa2
  67. Desserts
  68.     - Icecreams
  69.         - Icecream 1
  70.         - Icecream 2
  71.     - Pudding
  72.         - Pudding 1
  73.         - Pudding 2
  74.  
  75.  
  76. */
  77.  
  78. /**
  79.  * Randomize array element order in-place.
  80.  * Using Fisher-Yates shuffle algorithm.
  81.  * http://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array#answer-12646864
  82.  */
  83. function shuffleArray(array) {
  84.     for (var i = array.length - 1; i > 0; i--) {
  85.         var j = Math.floor(Math.random() * (i + 1));
  86.         var temp = array[i];
  87.         array[i] = array[j];
  88.         array[j] = temp;
  89.     }
  90.     return array;
  91. }
  92.  
  93. function printItems(){
  94.     for( var i=0; i<items.length; i++ ){
  95.         var depth = getDepth(items[i]);
  96.         var spacer = '';
  97.  
  98.         while( depth>0 ){
  99.             spacer +='&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
  100.             depth--;
  101.         }
  102.  
  103.         spacer += '- ';
  104.         document.write( spacer+items[i].title+'<br/>' );
  105.     }
  106.  
  107.     document.write('<br/>-------------------------------------------<br/>');
  108. }
  109.  
  110. function getDepth( item ){
  111.     if( item.parent==0 ){
  112.         return 0;
  113.     }
  114.     else{
  115.         var parent = {parent:0};
  116.         for (var i = newitems.length - 1; i >= 0; i--) {
  117.             if( newitems[i].id==item.parent ){
  118.                 parent = newitems[i];
  119.                 break;
  120.             }
  121.         };
  122.         return 1+getDepth( parent );//RECURSION
  123.     }
  124. }
  125.  
  126. function reArrange(){
  127.     if( parents_stack.length==0 || newitems.length==items.length )
  128.         return false;
  129.    
  130.     var parent = parents_stack[0];
  131.  
  132.     var children = [];
  133.     //find all the elements whose 'parent' is the given argument
  134.         for (var i = items.length - 1; i >= 0; i--) {
  135.             if( items[i].parent==parent ){
  136.                 children.push(items[i]);
  137.                 //also push it to the parents_stack, so that subsequent calls to this recursive function will check for their children
  138.                 parents_stack.push( items[i].id );
  139.             }
  140.         };
  141.  
  142.     //reorder them based on their 'order' attrubute
  143.         //bubble sort!
  144.         var sorted = false;
  145.         do{
  146.             var switched = false;
  147.             for (var i =0; i< children.length; i++) {
  148.                 if( i==0 ) continue;
  149.                 var previous_index = i-1;
  150.                 var current = children[i].order;
  151.                 var previous = children[previous_index].order;
  152.                
  153.                 if( current < previous ){
  154.                     //switch them
  155.                     var temp_prev = children[previous_index];
  156.                     children[previous_index] = children[i];
  157.                     children[i] = temp_prev;
  158.                     switched = true;
  159.                 }
  160.             }
  161.             //if any switch was made, we will mark sorted as false and will loop one more time
  162.             if( switched === true ){ sorted = false; }
  163.             else{ sorted = true; }
  164.  
  165.         } while( sorted == false );
  166.    
  167.    
  168.     //insert all of them right after their parent
  169.         //find the position of their parent
  170.             var parent_index = -1;
  171.             for (var i = 0; i < newitems.length; i++) {
  172.                 if( newitems[i].id==parent ){
  173.                     parent_index = i;
  174.                     break;
  175.                 }
  176.             };
  177.         //insert them after parent
  178.             var child_index = parent_index + 1;//increase by 1
  179.             for (var i = 0; i < children.length; i++) {
  180.                 newitems.splice( child_index, 0, children[i] );
  181.                 child_index++;
  182.             }
  183.  
  184.     //finally remove the current parent from parents_stack and call the function again
  185.         parents_stack.splice(0, 1);
  186.         reArrange();//RECURSION
  187. }
  188.  
  189. //randomise the items array
  190. items = shuffleArray( items );
  191.  
  192. var newitems = [];
  193. var parents_stack = [0];
  194.  
  195. //rearrange/properly arrange the items
  196. reArrange();
  197.  
  198. //properly arranged items
  199. items = newitems;
  200.  
  201. //reset parents_stack and print the menu items
  202. parents_stack = [0];
  203. printItems();
  204. </script>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement