Search code examples
javascriptjquerydatetimebootstrap-datepicker

Sort a string date array


I want to sort an array in ascending order. The dates are in string format

["09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015", "18/05/2015"] 

Even need a function to check whether these dates are in continuous form:

eg - Valid   - ["09/06/2015", "10/06/2015", "11/06/2015"] 
     Invalid - ["09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015"] 

Example code:

function sequentialDates(dates){
        var temp_date_array = [];

        $.each(dates, function( index, date ) {
            //var date_flag = Date.parse(date);
            temp_date_array.push(date);
        });

        console.log(temp_date_array);

        var last;
        for (var i = 0, l = temp_date_array.length; i < l; i++) {

          var cur = new Date();
          cur.setTime(temp_date_array[i]);
          last = last || cur;
          //console.log(last+' '+cur);

          if (isNewSequence(cur, last)) {
            console.log("Not Sequence");
          }
        }

        //return dates;
    }

     function isNewSequence(a, b) {
          if (a - b > (24 * 60 * 60 * 1000))
              return true;
          return false;
      }

Solution

  • The Simple Solution

    There is no need to convert Strings to Dates or use RegExp.

    The simple solution is to use the Array.sort() method. The sort function sets the date format to YYYYMMDD and then compares the string value. Assumes date input is in format DD/MM/YYYY.

    data.sort(function(a,b) {
      a = a.split('/').reverse().join('');
      b = b.split('/').reverse().join('');
      return a > b ? 1 : a < b ? -1 : 0;
      // return a.localeCompare(b);         // <-- alternative 
    });
    

    Update:

    A helpful comment suggested using localeCompare() to simplify the sort function. This alternative is shown in the above code snippet.

    Run Snippet to Test

    <!doctype html>
    <html>
    <body style="font-family: monospace">
    <ol id="stdout"></ol>
    <script>
      var data = ["09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015", "18/05/2015"];
    
    data.sort(function(a,b) {
      a = a.split('/').reverse().join('');
      b = b.split('/').reverse().join('');
      return a > b ? 1 : a < b ? -1 : 0;
      
      // return a.localeCompare(b);         // <-- alternative 
      
    });
    
    for(var i=0; i<data.length; i++) 
      stdout.innerHTML += '<li>' + data[i];
    </script>
    </body>
    </html>