2016-04-07 13 views
0

Ich habe ein Problem, meine Objekt-Arrays nach Datumswerte zu sortieren. Ich fand viele Fragen, die andere Benutzer zuvor gestellt hatten, ich ging alle möglichen Lösungen durch und ich bekam immer noch keine Lösung für mein Sortierproblem. Ich habe zwei verschiedene Arrays erstellt, um die Sortierfunktion zu testen, konnte aber die Daten nicht in der richtigen Reihenfolge abrufen. Hier sind meine Daten:So sortieren Sie Javascript Objekt Array nach Datum?

[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"}] 

ich diese Logik verwendet, um meine Daten von Datumswerten zu sortieren:

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

Meine Daten noch nicht in der richtigen Reihenfolge sortieren haben diese Funktion verwenden. Dann habe ich versucht, auch meine Array zu sortieren, die wie folgt aussieht:

var dates = Object.keys(groupedByDate); 

console.log(dates) 

Dies ist Ausgabe für variable Termine: ["12/12/2016", "04/21/2016"]

Dann habe ich versucht, dies zu tun:

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

Mein Ausgang hat noch sortiere meine Daten nicht in der richtigen Reihenfolge. Ich bin mir nicht sicher, ob ich etwas falsch mache oder etwas anderes könnte in diesem Fall ein Problem sein. Wenn jemand helfen kann, lass es mich wissen. Vielen Dank.

+0

Ich nehme an, Sie es in aufsteigender Reihenfolge sortiert werden soll? Deine Sortierung funktioniert für mich, aber sie sortiert sie in absteigender Reihenfolge .... Wo erwartest du auch nur Daten als Ausgabe? – MinusFour

+0

Ich denke, Ihre erste Sortierfunktion ist korrekt, aber die "Datumsfolge" für den Datumskonstruktor ist nicht. Sie sollten überprüfen, ob die Date-Instanzen korrekt aufgebaut sind. – michaPau

Antwort

1

Die Antworten hier sind auf der richtigen Spur, aber Sie sollten niemals den Date-Konstruktor oder Date.parse verwenden, um Strings zu analysieren. Verwenden Sie eine Bibliothek und übergeben Sie das Format oder schreiben Sie eine einfache Funktion, z.

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

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

So, jetzt haben Sie:

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

sortieren Daten mit Date.getTime() Funktion (nach Anzahl der Millisekunden):

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

Nicht mit den ternären kümmern und nur 'a - b' zurückgeben. –

+0

@ FrédéricHamidi, getan – RomanPerekhrest

+0

Eine andere Möglichkeit, .getTime zu erhalten, besteht darin, einfach das Datum mit 1 zu multiplizieren. (neues Datum()) * 1 –

1

Sie könnten das Datum geteilt und mit den Teilen sortieren.

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

scheint, gibt es ein Problem in der json Sie eingefügt. { eventDate="12/12/2016", display_order="3"} .Instead von = es : sein muss Sie korrigieren json-Format die folgenden Lösungen können

Unter der Annahme haben
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

Also versuchte ich alle Antworten oben nützlich sein, einige von ihnen gab mir nahe, aber nicht die volle Lösung für meinen Fall. Also versuchte ich einfach zu kombinieren und dies ist richtige Lösung für mein Problem:

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

Wenn ich habe gerade versucht, A und B zurück, die für einen Datensatz gearbeitet, aber dann, wenn ich Benutzer in meinem onChange wechseln Dropdown I bekam wieder umgekehrte Daten. Also Lösung oben mit new Date() und getTime() funktioniert gut. Danke Ihnen allen für Ihre Hilfe!

+1

** Nicht ** Strings mit dem Date-Konstruktor oder * Date.parse * analysieren (sie sind gleichwertig für die Analyse). Das Format im OP wird nicht von der Sprachspezifikation unterstützt (die ohnehin schlecht implementiert ist). Strings müssen immer manuell analysiert werden. Sie können eine Bibliothek verwenden, aber in diesem Fall benötigen Sie nur eine 2-Zeilen-Funktion, um die Aufgabe zu erledigen. In diesem Fall können Sie die Zeichenfolgen einfach als ISO-8601-Datumsangaben neu formatieren und die Zeichenfolgen vergleichen oder Datumsobjekte erstellen. – RobG

Verwandte Themen