Сортировка результатов 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');
});
});