2016-04-07 10 views
0

У меня возникла проблема в сортировке массивов объектов по значениям даты. Я нашел много вопросов, которые задавали другие пользователи раньше, я прошел все возможные решения, и у меня все еще не было решения для моей проблемы с сортировкой. Я также создал два разных массива для проверки функции сортировки, но не смог получить даты в правильном порядке. Вот мои данные:Как отсортировать массив объектов Javascript по дате?

[Object { eventDate="12/12/2016", display_order="5"},Object { eventDate="12/12/2016", display_order="3"}] 

[Object { eventDate="04/21/2016", display_order="3"},Object { eventDate="04/21/2016", display_order="1"}] 

Я использовал эту логику, чтобы упорядочить данные по значениям даты:

entries.sort(function(a,b){ 
    var i = new Date(a.eventDate); 
    var j = new Date(b.eventDate); 
    return i-j; 
}); 

Мои данные еще не отсортированы в правильном порядке, с помощью этой функции. Тогда я попытался упорядочить массив, который выглядит следующим образом:

var dates = Object.keys(groupedByDate); 

console.log(dates) 

Это выход для переменной даты: ["12/12/2016", "04/21/2016"]

Затем я попытался сделать это:

dates.sort(function(a, b) { 
    a = new Date(a.dates); 
    b = new Date(b.dates); 
    return a>b ? -1 : a<b ? 1 : 0; 
}); 

Мой выход еще сделал не сортировать мои даты в правильном порядке. Я не уверен, что я делаю что-то неправильно или что-то еще может быть проблемой в этом случае. Если кто-нибудь может помочь, пожалуйста, дайте мне знать. Благодарю.

+0

Я предполагаю, что вы хотите отсортировать его в порядке возрастания? Ваш вид работает для меня, но он заказывает его в порядке убывания .... Где вы также ожидаете только даты в качестве результата? – MinusFour

+0

Я думаю, что ваша первая функция сортировки верна, но 'datestring' для конструктора Date не является. Вы должны проверить правильность построения экземпляров даты. – michaPau

ответ

1

Ответы здесь на правильном пути, но вы никогда не должны использовать конструктор Date или Date.parse для синтаксического анализа строк. Используйте библиотеку и передайте формат, или напишите простую функцию, например.

function parseMDY(s) { 
 
    var b = s.split('/'); 
 
    return new Date(b[2],b[0]-1,b[1]); 
 
} 
 

 
document.write(parseMDY('4/30/2016'));

Так что теперь у вас есть:

entries.sort(function(a,b) { 
    return parseMDY(a) - parseMDY(b); 
}); 
1

Сортировка дат с помощью функции (Date.getTime()по количеству миллисекунд):

dates.sort(function(a, b) { 
    a = (new Date(a.dates)).getTime(); 
    b = (new Date(b.dates)).getTime(); 
    return a - b; 
}); 
+1

Не трогайте тройники и просто возвращайте 'a - b'. –

+0

@ FrédéricHamidi, сделано – RomanPerekhrest

+0

Другой способ получить .getTime - просто умножить дату на 1. Например. (новая дата()) * 1 –

1

можно разделить дату и сортировки с частями.

var array = [{ eventDate: "12/12/2016", display_order: "5" }, { eventDate: "12/12/2016", display_order: "3" }, { eventDate: "04/21/2016", display_order: "3" }, { eventDate: "04/21/2016", display_order: "1" }]; 
 

 
array.sort(function (a, b) { 
 
    var aa = a.eventDate.split('/'), 
 
     bb = b.eventDate.split('/'); 
 
    return aa[2] - bb[2] || aa[0] - bb[0] || aa[1] - bb[1]; 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>');

1

Кажется есть проблема в формате JSON вы вставили. { eventDate="12/12/2016", display_order="3"} .Instead из = он должен быть : Если у вас есть правильный формат JSON приведенные ниже решения могут быть полезны

var array = [{ eventDate:"12/12/2016", display_order:"5"}, 
       { eventDate:"12/12/2016", display_order:"3"}, 
       { eventDate:"04/21/2016", display_order:"3"}, 
       { eventDate:"04/21/2016", display_order:"1"}]; 

// Generic solution 
var sortedArray = array.sort(function(a,b) { 
    return new Date(a.eventDate).getTime() - new Date(b.eventDate).getTime() 
}); 


// Solution using ternary operator 
var l =array.sort(function(a,b){ 
    return a.eventDate>b.eventDate ? -1 : a.eventDate<b.eventDate ? 1 : 0; 
}); 

Demo

0

Так что я попытался все ответы выше, некоторые из них дали мне близко, но не полностью решение для моего дела. Так что я просто пытался совместить и это правильное решение для моей проблемы:

dates.sort(function(a, b) { 
    return new Date(a).getTime() - new Date(b).getTime(); 
}); 

Если бы я попытался вернуть только A и B, которые работали на одной записи, но потом, когда я переключаюсь пользователя в моем OnChange выпадающий я снова получал обратные даты. Таким образом, решение выше с new Date() и getTime() прекрасно работает. Спасибо за вашу помощь!

+1

** Не ** анализировать строки с конструктором Date или * Date.parse * (они эквивалентны для синтаксического анализа). Формат в OP не поддерживается спецификацией языка (которая в любом случае плохо реализована), всегда вручную анализирует строки. Вы можете использовать библиотеку, но в этом случае вам просто нужна 2-строчная функция для выполнения задания. В этом случае вы можете просто переформатировать строки как даты ISO-8601, сравнить строки или создать объекты Date. – RobG