379 Stimmen

Array von Objekten nach einem einzelnen Schlüssel mit Datumswert sortieren

Ich habe ein Array von Objekten mit mehreren Schlüssel-Wert-Paaren, und ich muss sie basierend auf "updated_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?

483voto

Rocket Hazmat Punkte 213999

Sie können verwenden Array.sort .

Hier ist ein Beispiel:

var arr = [{
    "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"
  }
]

arr.sort(function(a, b) {
  var keyA = new Date(a.updated_at),
    keyB = new Date(b.updated_at);
  // Compare the 2 dates
  if (keyA < keyB) return -1;
  if (keyA > keyB) return 1;
  return 0;
});

console.log(arr);

198voto

David Brainer Punkte 6123

Ich habe hier bereits eine sehr ähnliche Frage beantwortet: Einfache Funktion zum Sortieren eines Arrays von Objekten

Für diese Frage habe ich diese kleine Funktion erstellt, die das tun könnte, was Sie wollen:

function sortByKey(array, key) {
    return array.sort(function(a, b) {
        var x = a[key]; var y = b[key];
        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
    });
}

67voto

Patrick W. McMahon Punkte 3251

En Array.sort() Methode sortiert die Elemente eines Arrays an Ort und Stelle und gibt das Array zurück. Seien Sie vorsichtig mit Array.sort() denn es ist nicht Unveränderlich . Für unveränderliche Sortierung verwenden Sie unveränderbar-sortieren .

Diese Methode sortiert das Array anhand der aktuellen updated_at im ISO-Format. Wir verwenden new Data(iso_string).getTime() um die ISO-Zeit in einen Unix-Zeitstempel umzuwandeln. Ein Unix-Zeitstempel ist eine Zahl, mit der wir einfache mathematische Berechnungen durchführen können. Wir subtrahieren den ersten und den zweiten Zeitstempel und das Ergebnis ist: Wenn der erste Zeitstempel größer ist als der zweite, ist die Rückgabezahl positiv. Wenn die zweite Zahl größer ist als die erste, ist der Rückgabewert negativ. Wenn beide gleich sind, ist der Rückgabewert Null. Dies stimmt perfekt mit den erforderlichen Rückgabewerten für die Inline-Funktion überein.

Para ES6 :

arr.sort((a,b) => new Date(a.updated_at).getTime() - new Date(b.updated_at).getTime());

Para ES5 :

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

Wenn Sie Ihre updated_at zu Unix-Zeitstempeln zu machen, können Sie dies tun:

Para ES6 :

arr.sort((a,b) => a.updated_at - b.updated_at);

Para ES5 :

arr.sort(function(a,b){ 
 return a.updated_at - b.updated_at;
});

Zum Zeitpunkt der Veröffentlichung dieses Beitrags unterstützen moderne Browser ES6 nicht. Um ES6 in modernen Browsern zu verwenden, verwenden Sie babel um den Code nach ES5 zu transpilieren. Erwarten Sie in naher Zukunft Browser-Unterstützung für ES6.

Array.sort() sollte einen Rückgabewert mit einem von 3 möglichen Ergebnissen erhalten:

  • Eine positive Zahl (erste Position > zweite Position)
  • Eine negative Zahl (erste Position < zweite Position)
  • 0, wenn die beiden Posten gleich sind

Beachten Sie, dass der Rückgabewert der inlin positive oder negative Zahl sein kann. Array.Sort() kümmert sich nicht darum, was die Rückgabewert ist. Es ist nur wichtig, ob der Rückgabewert positiv ist, negativ oder Null ist.

Für unveränderliche Sortierung: (Beispiel in ES6)

const sort = require('immutable-sort');
const array = [1, 5, 2, 4, 3];
const sortedArray = sort(array);

Sie können es auch so schreiben:

import sort from 'immutable-sort';
const array = [1, 5, 2, 4, 3];
const sortedArray = sort(array);

Das import-from, das Sie sehen, ist ein neuer Weg, Javascript in ES6 einzubinden und lässt Ihren Code sehr sauber aussehen. Mein persönlicher Favorit.

Bei der unveränderlichen Sortierung wird das Ausgangs-Array nicht verändert, sondern ein neues Array zurückgegeben. Verwendung von const wird für unveränderliche Daten empfohlen.

24voto

Mohammed Safeer Punkte 19013

Verwenden Sie underscore js oder lodash,

var arrObj = [
    {
        "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"
    }
];

arrObj = _.sortBy(arrObj,"updated_at");

_.sortBy() gibt ein neues Array zurück

siehe http://underscorejs.org/#sortBy und lodash-Dokumente https://lodash.com/docs#sortBy

22voto

knowbody Punkte 7783

Mit ES2015-Unterstützung kann dies durch:

foo.sort((a, b) => a.updated_at < b.updated_at ? -1 : 1)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X