Ich habe ein Array von Objekten mit mehreren Schlüsselwertpaaren und muss sie nach 'update_at' sortieren:
[
{
"updated_at" : "2012-01-01T06:25:24Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-09T11:25:13Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-05T04:13:24Z",
"foo" : "bar"
}
]
Was ist der effizienteste Weg, dies zu tun?
javascript
arrays
object
Keks Monster
quelle
quelle
Antworten:
Sie können verwenden
Array.sort
.Hier ist ein Beispiel:
quelle
keyA - keyB
(oder möglicherweisekeyB - keyA
) verwenden? Die Datumsobjekte haben einevalueOf()
Methode.a-b
ist wirklich wichtig, wenn Sie langen Code vermeiden möchten. Obwohl langer Code in diesem Fall nicht unbedingt schlecht ist, denke ich, dass die Ausführlichkeit das Verständnis erschwert. Ich benutze derzeitvalues.sort((a,b)=>a.attr-b.attr)
. Es wird mühsam, jedes Mal 5 Zeilen schreiben zu müssen, wenn Sie ein Array sortieren müssen.Eine wirklich ähnliche Frage habe ich hier bereits beantwortet: Einfache Funktion zum Sortieren eines Arrays von Objekten
Für diese Frage habe ich diese kleine Funktion erstellt, die das tun kann, was Sie wollen:
quelle
-1
:)array = array.reverse()
Funktion.Die Methode Array.sort () sortiert die Elemente eines Arrays an Ort und Stelle und gibt das Array zurück. Seien Sie vorsichtig mit Array.sort (), da es nicht unveränderlich ist . Verwenden Sie für unveränderliche Sortierung unveränderliche Sortierung .
Diese Methode dient zum Sortieren des Arrays nach Ihrem aktuellen
updated_at
ISO-Format. Wirnew Data(iso_string).getTime()
konvertieren die ISO-Zeit in einen Unix-Zeitstempel. Ein Unix-Zeitstempel ist eine Zahl, mit der wir einfach rechnen können. Wir subtrahieren den ersten und zweiten Zeitstempel, der das Ergebnis ist; Wenn der erste Zeitstempel größer als der zweite ist, ist die Rückgabezahl positiv. Wenn die zweite Zahl größer als die erste ist, ist der Rückgabewert negativ. Wenn die beiden gleich sind, ist die Rendite Null. Dies stimmt perfekt mit den erforderlichen Rückgabewerten für die Inline-Funktion überein.Für ES6 :
Für ES5 :
Wenn Sie Ihre
updated_at
Unix-Zeitstempel ändern , können Sie dies tun:Für ES6 :
Für ES5 :
Zum Zeitpunkt dieses Beitrags unterstützen moderne Browser ES6 nicht. Um ES6 in modernen Browsern zu verwenden, verwenden Sie babel, um den Code in ES5 zu transpilieren. Erwarten Sie in naher Zukunft Browserunterstützung für ES6.
Array.sort () sollte einen Rückgabewert von einem von 3 möglichen Ergebnissen erhalten:
Für unveränderliche Sortierung: (Beispiel in ES6)
Sie können es auch so schreiben:
Der Import von ist eine neue Möglichkeit, Javascript in ES6 aufzunehmen, und lässt Ihren Code sehr sauber aussehen. Mein persönlicher Favorit.
Die unveränderliche Sortierung mutiert das Quellarray nicht, sondern gibt ein neues Array zurück. Die Verwendung
const
wird für unveränderliche Daten empfohlen.quelle
Hier ist eine leicht modifizierte Version der Antwort von @David Brainer-Bankers, die alphabetisch nach Zeichenfolge oder numerisch nach Zahlen sortiert und sicherstellt, dass Wörter, die mit Großbuchstaben beginnen, nicht über Wörtern sortiert werden, die mit Kleinbuchstaben beginnen (z. B. "apple, Early"). würde in dieser Reihenfolge angezeigt werden).
quelle
Verwenden Sie Unterstrich js oder lodash,
_.sortBy()
gibt ein neues Array zurücksiehe http://underscorejs.org/#sortBy und lodash docs https://lodash.com/docs#sortBy
quelle
Mit ES2015-Unterstützung kann dies erfolgen durch:
quelle
new Date(iso_str).getTime()
werden, um einen Unix-Zeitstempel zurückzugeben.Daten importiert
FÜR Aufsteigende Reihenfolge
Beispiel für Asc Order
FÜR absteigende Reihenfolge
Beispiel für Desc Order
quelle
Wie in dieser Antwort angegeben, können Sie verwenden
Array.sort
.arr.sort(function(a,b){return new Date(a.updated_at) - new Date(b.updated_at)})
quelle
Nur eine andere, mathematischere Art, dasselbe zu tun, aber kürzer :
oder im glatten Lambda-Pfeil-Stil:
Diese Methode kann mit jeder numerischen Eingabe durchgeführt werden
quelle
Bis heute können die Antworten von @knowbody ( https://stackoverflow.com/a/42418963/6778546 ) und @Rocket Hazmat ( https://stackoverflow.com/a/8837511/6778546 ) kombiniert werden, um ES2015-Unterstützung bereitzustellen und korrekte Datumsbehandlung:
quelle
Ich habe in Typescript eine Sortierfunktion erstellt, mit der wir Zeichenfolgen, Datumsangaben und Zahlen in einer Reihe von Objekten suchen können. Es kann auch nach mehreren Feldern sortiert werden.
Verwendung:
quelle
Das Sortieren nach einem ISO-formatierten Datum kann teuer sein, es sei denn, Sie beschränken die Clients auf die neuesten und besten Browser, die durch Datumsanalyse der Zeichenfolge den richtigen Zeitstempel erstellen können.
Wenn Sie sich Ihrer Eingabe sicher sind und wissen, dass es sich immer um JJJJ-MM-TTTHH: MM: SS und GMT (Z) handelt, können Sie die Ziffern aus jedem Element extrahieren und wie Ganzzahlen vergleichen
Wenn das Datum anders formatiert werden könnte, müssen Sie möglicherweise etwas für iso-herausgeforderte Personen hinzufügen:
quelle
Date.parse
?Der Vollständigkeit halber ist hier eine mögliche kurze generische Implementierung von sortBy:
Beachten Sie, dass hierfür die Sortiermethode für Arrays verwendet wird, die an Ort und Stelle sortiert wird. Für eine Kopie können Sie arr.concat () oder arr.slice (0) oder eine ähnliche Methode verwenden, um eine Kopie zu erstellen.
quelle
Damit können wir eine Schlüsselfunktion übergeben, die für die Sortierung verwendet werden soll
Dann zum Beispiel, wenn wir haben
Wir können es tun
oder
oder
quelle
Sie können die Lodash- Dienstprogrammbibliothek verwenden, um dieses Problem zu lösen (es ist eine recht effiziente Bibliothek):
Dokumentation finden Sie hier: https://lodash.com/docs/4.17.15#orderBy
quelle
Sie können einen Verschluss erstellen und ihn so weitergeben. Hier ist mein Beispiel
quelle
quelle
Array.sort()
diese Option, um ein Array zu sortieren…
), um die Funktion rein zu machenupdated_at
)Array.sort()
Subtrahiert zwei Eigenschaften vom aktuellen und nächsten Element, wenn es sich um eine Zahl / ein Objekt handelt, an dem Sie arrhythmische Operationen ausführen könnenquelle
Ich stehe vor der gleichen Sache, also behandle ich dies mit einem generischen Warum und baue eine Funktion dafür:
quelle