Сортировка результатов XML по дате с использованием jQuery

У меня много проблем с сортировкой возвращенных данных XML по дате. Даты хранятся в формате ГГГГ-ММ-ДД. Я изо всех сил пытаюсь найти любую помощь онлайн для этого определенного формата даты.

Вот мой 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');
            });
        }
    });
});

и вот пример моего 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>

2 ответа

Решение

Сохраните метку времени в атрибуте данных и элементы в массиве, затем отсортируйте массив на основе меток времени перед добавлением элементов:

$(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); 
            });
        }
    });
});

Загрузка в массив не требуется. Преврати свою коллекцию в массив объектов и перебери ее. Переменная xmlevents демонстрирует, как это делается. Также объявите свои переменные var вне петли. Это нужно сделать только один раз.

$(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');
        });
});
Другие вопросы по тегам