dalefknight
dalefknight

Reputation: 13

Sorting XML results by date using jQuery

I am having a lot of trouble sorting my returned XML data by date. The dates are stored as YYYY-MM-DD. I'm struggling to find any help online for this specific date format.

Here is my js:

$(document).ready(function () {
    $.ajax({
        type: "GET",
        url: "database.xml",
        dataType: "xml",
        success: function (xml) {
            $(xml).find("event").filter(function () {
                return $(this).find("eventplace").text() == 'NEWCASTLE';
            }).each(function () {
                var title = $(this).find('eventname').text();
                var venue = $(this).find('eventvenue').text();
                var city = $(this).find('eventplace').text();
                var date = $(this).find('eventdate').text();
                $('<div class="items">' + title + '</div>').html(title + venue + city + date).appendTo('#comingup');
            });
        }
    });
});

and here is a sample of my XML:

<Root_Element>
<eventserie>
    <event>
        <eventname>LITTLE COMETS</eventname>
        <eventvenue>O2 ACADEMY</eventvenue>
        <eventplace>NEWCASTLE</eventplace>
        <eventdate>2014-02-21</eventvdate>
    </event>
    <event>
        <eventname>SYMPHONIC PICTURES</eventname>
        <eventvenue>THE CLUNY</eventvenue>
        <eventplace>NEWCASTLE</eventplace>
        <eventdate>2014-03-10</eventvdate>
    </event>
    <event>
        <eventname>LET'S BUY HAPPINESS</eventname>
        <eventvenue>THINK TANK</eventvenue>
        <eventplace>NEWCASTLE</eventplace>
        <eventdate>2014-02-10</eventvdate>
    </event>
</eventserie></Root_Element>

Upvotes: 1

Views: 2590

Answers (2)

Larry
Larry

Reputation: 21

Pushing to an array isn't necessary. Turn your collection into an object array and sort through it. The variable xmlevents demonstrates how that is done. Also declare your variables var outside of the loop. That need only be done once.

$(document).ready(function () {
  $.ajax({
    type: "GET",
    url: "database.xml",
    dataType: "xml",
    success: function (xml) {
    var xmlevents = $(xml).find("event");
    xmlevents.sort(function(a,b){
     a = $(a).find("eventdate").text();
     b = $(b).find("eventdate").text();
     return (a.localeCompare(b));
    }
    var title, venue, city, date 
    xmlevents.each(function () {
      title = $(this).find('eventname').text();
      venue = $(this).find('eventvenue').text();
      city = $(this).find('eventplace').text();
      date = $(this).find('eventdate').text();
            $('<div class="items">' + title + '</div>').html(title + venue + city + date).appendTo('#comingup');
        });
});

Upvotes: 2

adeneo
adeneo

Reputation: 318172

Store the timestamp in a data attribute, and the elements in an array, then sort the array based on the timestamps before appending the elements :

$(document).ready(function () {
    $.ajax({
        type: "GET",
        url: "database.xml",
        dataType: "xml",
        success: function (xml) {

            var items = [];

            $(xml).find("event").filter(function () {
                return $(this).find("eventplace").text() == 'NEWCASTLE';
            }).each(function () {
                var title = $(this).find('eventname').text();
                var venue = $(this).find('eventvenue').text();
                var city = $(this).find('eventplace').text();
                var date = $(this).find('eventdate').text();

                items.push(
                    $('<div />', {
                        'class'  : 'items',
                        text     : title + venue + city + date,
                        'data-d' : new Date(date).getTime()
                    })
                );
            });

            items.sort(function(a, b) {
               return $(a).data('d').localeCompare( $(b).data('d') );
            });

            $.each(items, function(idx, itm) { 
                $('#comingup').append(itm); 
            });
        }
    });
});

Upvotes: 2

Related Questions