Tag Archives: Sorting

Sorting Arrays in JavaScript, from the Inside-Out.

Every now and then I come across questions on StackOverflow that require me to do a bit of thought-work. This particular question was asking to to take an array, such as [‘a’,’b’,’c’,’d’,’e’], and flip it inside out, so that it becomes [‘c’,’d’,’b’,’e’,’a’]. I’m not a particularly mathematical person, so when I discover a difficult to discern pattern, I get excited – such was the case with the code below.

// Arrays to sort
var data = ["a","b","c","d","e"],
    info = ["a","b","c","d"];

// Sort array from inside-out ['a','b','c','d','e'] 
// Resulting in the following ['c','d','b','e','a']
function gut (arr) {
    
    // Resulting array, Counting variable, Number of items, 
    // initial Location
    var out = [], cnt, 
        num = arr.length, 
        loc = Math.floor(num/2);
    
    // Cycle through as many times as the array is long
    for (cnt = 0; cnt < num; cnt++)
         // Protecting our cnt variable
         (function () {
             // If our array has an odd number of entries
             if (num % 2) {
                 // If on an odd iteration
                 if (cnt % 2) {
                     // Move location forward
                     loc = loc + (+cnt); 
                 } else {
                     // Move location backwards
                     loc = loc + (-cnt);  
                 }
             // Our array has an even number of entries
             } else {
                 // If on an odd iteration
                 if (cnt % 2) {
                     // Move location backwards
                     loc = loc + (-cnt);
                 } else {
                     // Move location forwards
                     loc = loc + (+cnt);
                 }
             }
             // Push val at location to new array
             out.push(arr[loc]);
         })()
             
     // Return new array
     return out;
     
 }
 
 // Test with two arrays; even and odd sizes.
 console.log(gut(data), gut(info));‚Äč

Which results in the following output:

["c", "d", "b", "e", "a"]
["c", "b", "d", "a"]

Perhaps you will find some use for it.