1267 Stimmen

Wie sortiert man ein Objekt-Array nach Datumseigenschaften?

Angenommen, ich habe ein Array mit einigen Objekten:

var array = [{id: 1, date: Mar 12 2012 10:00:00 AM}, {id: 2, date: Mar 8 2012 08:00:00 AM}];

Wie kann ich dieses Array nach dem Datumselement sortieren, beginnend mit dem Datum, das dem aktuellen Datum und der aktuellen Uhrzeit am nächsten liegt? Beachten Sie, dass das Array viele Objekte haben kann, aber der Einfachheit halber habe ich 2 verwendet.

Würde ich die Sortierfunktion und einen benutzerdefinierten Komparator verwenden?

30voto

jherax Punkte 5128

Ich empfehle GitHub: Array sortBy - eine optimale Umsetzung von sortBy Methode, die die Schwartzsche Transformation

Aber für den Moment werden wir diesen Ansatz versuchen Gist: sortBy-old.js .
Erstellen wir eine Methode zum Sortieren von Arrays, die in der Lage ist, Objekte nach einer Eigenschaft zu ordnen.

Erstellen der Sortierfunktion

var sortBy = (function () {
  var toString = Object.prototype.toString,
      // default parser function
      parse = function (x) { return x; },
      // gets the item to be sorted
      getItem = function (x) {
        var isObject = x != null && typeof x === "object";
        var isProp = isObject && this.prop in x;
        return this.parser(isProp ? x[this.prop] : x);
      };

  /**
   * Sorts an array of elements.
   *
   * @param {Array} array: the collection to sort
   * @param {Object} cfg: the configuration options
   * @property {String}   cfg.prop: property name (if it is an Array of objects)
   * @property {Boolean}  cfg.desc: determines whether the sort is descending
   * @property {Function} cfg.parser: function to parse the items to expected type
   * @return {Array}
   */
  return function sortby (array, cfg) {
    if (!(array instanceof Array && array.length)) return [];
    if (toString.call(cfg) !== "[object Object]") cfg = {};
    if (typeof cfg.parser !== "function") cfg.parser = parse;
    cfg.desc = !!cfg.desc ? -1 : 1;
    return array.sort(function (a, b) {
      a = getItem.call(cfg, a);
      b = getItem.call(cfg, b);
      return cfg.desc * (a < b ? -1 : +(a > b));
    });
  };

}());

Einstellung unsortierter Daten

var data = [
  {date: "2011-11-14T17:25:45Z", quantity: 2, total: 200, tip: 0,   type: "cash"},
  {date: "2011-11-14T16:28:54Z", quantity: 1, total: 300, tip: 200, type: "visa"},
  {date: "2011-11-14T16:30:43Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-14T17:22:59Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-14T16:53:41Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-14T16:48:46Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-31T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "visa"},
  {date: "2011-11-01T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab"},
  {date: "2011-11-14T16:58:03Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-14T16:20:19Z", quantity: 2, total: 190, tip: 100, type: "tab"},
  {date: "2011-11-14T17:07:21Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-14T16:54:06Z", quantity: 1, total: 100, tip: 0,   type: "cash"}
];

Verwendung

Schließlich ordnen wir das Array an, indem wir "date" Eigenschaft als string

//sort the object by a property (ascending)
//sorting takes into account uppercase and lowercase
sortBy(data, { prop: "date" });

Wenn Sie die Groß- und Kleinschreibung ignorieren wollen, setzen Sie den "parser" Rückruf:

//sort the object by a property (descending)
//sorting ignores uppercase and lowercase
sortBy(data, {
    prop: "date",
    desc: true,
    parser: function (item) {
        //ignore case sensitive
        return item.toUpperCase();
    }
});

Wenn Sie das Feld "Datum" als "Datum" behandeln wollen Date Typ:

//sort the object by a property (ascending)
//sorting parses each item to Date type
sortBy(data, {
    prop: "date",
    parser: function (item) {
        return new Date(item);
    }
});

Hier können Sie das obige Beispiel nachspielen:
jsbin.com/lesebi

21voto

Edison D'souza Punkte 4385

Dies sollte genügen, wenn Ihr Datum in diesem Format vorliegt (tt/mm/jjjj).

  sortByDate(arr) {
    arr.sort(function(a,b){
      return Number(new Date(a.readableDate)) - Number(new Date(b.readableDate));
    });

    return arr;
  }

Dann rufen Sie sortByDate(myArr);

20voto

Arr ist ein Array von Objekten und jedes Objekt hat date_prop, das ein Datum ist. Sie können es in absteigender/abnehmender Reihenfolge wie folgt sortieren

 arr = arr.sort(function (a, b) {
      var dateA = new Date(a.date_prop).getTime();
      var dateB = new Date(b.date_prop).getTime();
      return dateA < dateB ? 1 : -1; // ? -1 : 1 for ascending/increasing order
    });

15voto

varad_s Punkte 625

Mit ES6-Pfeilfunktionen können Sie weiterhin nur eine Zeile prägnanten Code schreiben (ohne Variablendeklaration).

Beispiel:

var isDescending = true; //set to false for ascending
console.log(["8/2/2020","8/1/2020","8/13/2020", "8/2/2020"].sort((a,b) => isDescending ? new Date(b).getTime() - new Date(a).getTime() : new Date(a).getTime() - new Date(b).getTime()));

Da die Zeit bei den oben genannten Daten nicht vorhanden ist, wird das Date-Objekt die folgende Standardzeit für die Sortierung berücksichtigen:

00:00:00

Der Code funktioniert sowohl bei aufsteigender als auch bei absteigender Sortierung. Ändern Sie einfach den Wert von isDescending Variable nach Bedarf.

15voto

Robert Punkte 2209

Sie könnten sortBy in underscore js verwenden.

http://underscorejs.org/#sortBy

Beispiel:

var log = [{date: '2016-01-16T05:23:38+00:00', other: 'sample'}, 
           {date: '2016-01-13T05:23:38+00:00',other: 'sample'}, 
           {date: '2016-01-15T11:23:38+00:00', other: 'sample'}];

console.log(_.sortBy(log, 'date'));

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