webentwicklung-frage-antwort-db.com.de

Was ist der elegante Weg, um das späteste Datum aus einer Reihe von Objekten auf der Clientseite zu erhalten?

Ich benutze eckigejs im Projekt.

Ich bekomme ein Array von Objekten vom Server ... Jedes Objekt enthält wenige Eigenschaften, und eine davon ist die Datumseigenschaft.

Hier ist das Array (in Json), das ich vom Server bekomme:

[
  {
    "Address": 25,
    "AlertType": 1,
    "Area": "North",
    "MeasureDate": "2019-02-01T00:01:01.001Z",
    "MeasureValue": -1
  },
  {
    "Address": 26,
    "AlertType": 1,
    "Area": "West",
    "MeasureDate": "2016-04-12T15:13:11.733Z",
    "MeasureValue": -1
  },
  {
    "Address": 25,
    "AlertType": 1,
    "Area": "North",
    "MeasureDate": "2017-02-01T00:01:01.001Z",
    "MeasureValue": -1
  }
          .
          .
          .
]

Ich muss das späteste Datum vom Array erhalten.

Wie erhält man auf elegante Art und Weise das aktuelle Datum aus einer Reihe von Objekten?

22
Michael

Eine saubere Methode wäre, jedes Datum in eine Date() umzuwandeln und die max

new Date(Math.max.apply(null, a.map(function(e) {
  return new Date(e.MeasureDate);
})));

dabei ist a das Array von Objekten.

Dies bedeutet, dass jedes der Objekte im Array einem Datum zugeordnet wird, das mit dem Wert MeasureDate erstellt wurde. Dieses zugeordnete Array wird dann auf die Math.max-Funktion angewendet, um das letzte Datum abzurufen, und das Ergebnis wird in ein Datum konvertiert.

Durch die Zuordnung der String-Datums zu JS Date-Objekten verwenden Sie am Ende eine Lösung wie Min/Max von Datumsangaben in einem Array.

-

Eine weniger saubere Lösung wäre, die Objekte einfach dem Wert von MeasureDate zuzuordnen und das String-Array zu sortieren. Dies funktioniert nur aufgrund des von Ihnen verwendeten Datumsformats.

a.map(function(e) { return e.MeasureDate; }).sort().reverse()[0]

Wenn die Leistung von Belang ist, sollten Sie das Array reduce verwenden, um das Maximum zu erhalten, anstatt sort und reverse zu verwenden.

28
arcyqwerty

Änderung von Anton Haralds Antwort: Das Array, das ich habe, verwendet ModDate anstelle von MeasureDate. Ich wähle das jüngste Datum. Das funktioniert.

  getLatestDate(xs) {
   if (xs.length) {
   return xs.reduce((m,v,i) => (v.ModDate > m.ModDate) && i ? v : m).ModDate;
  }
}

m = Akkumulator, v = aktuell, i = Index 

Umgebung: TypeScript, ES6

3
Larry Popiel
function getLatestDate(data) {
   // convert to timestamp and sort
   var sorted_ms = data.map(function(item) {
      return new Date(item.MeasureDate).getTime()
   }).sort(); 
   // take latest
   var latest_ms = sorted_ms[sorted_ms.length-1];
   // convert to js date object 
   return new Date(latest_ms);
}

var data = [{MeasureDate: "2014-10-04T16:10:00"},
            {MeasureDate: "2013-10-04T16:10:00"},
            {MeasureDate: "2012-10-04T16:10:00"}];

getLatestDate(data).toString(); // "Sat Oct 04 2014 18:10:00 GMT+0200 (CEST)"

Diese Funktion gibt das letzte Datum als JavaScript-Datumsobjekt zurück. Sie können ihn auch mit der Date-Object-Methode toISOString () in einen ISO-String (das Format Ihrer Quelldaten) umwandeln.

var date_str = "2012-10-04T16:10:00";
(new Date(date_str)).toISOString(); // "2012-10-04T16:10:00.000Z"

Wie Sie sehen, enthält das Ergebnis der Methode am Ende immer null Millisekunden. Wenn Sie Ihre ursprüngliche ISO-Datenzeichenfolge als Ergebnis benötigen, möchten Sie möglicherweise die folgende Funktion verwenden:

function getLatestDate2(data) {

   var sorted = data.map(function(item) {
      var MeasureDate = item.MeasureDate;
      return {original_str: MeasureDate,
              in_ms: (new Date(MeasureDate)).getTime()}
   }).sort(function(item1, item2) {
      return (item1.in_ms < item2.in_ms)
   }); 

   // take latest
   var latest = sorted[0];

   return latest.original_str;
}

getLatestDate2(data); // "2014-10-04T16:10:00"
2
Anton Harald

Wenn Sie das gesamte Objekt erhalten möchten, nicht nur das Datum ...

Wenn also OPs Array von Objekten a zugewiesen wurde, erhalten Sie das Objekt mit der neuesten MeasureDate:

var mostRecentDate = new Date(Math.max.apply(null, a.map( e => {
   return new Date(e.MeasureDate);
})));
var mostRecentObject = a.filter( e => { 
    var d = new Date( e.MeasureDate ); 
    return d.getTime() == mostRecentDate.getTime();
})[0];

Hinweis: Diese Lösung ist eine Erweiterung der obigen Antwort von @ archyqwerty. Ihre Lösung ergab nur das jüngste Datum aus einer Reihe von Objekten. Diese Lösung gibt Ihnen das gesamte Objekt, dem das Datum angehört.  

1
Travis Heeter

Inspiriert durch viele Vorschläge und Kommentare in diesem Thread, finden Sie hier eine weitere Lösung für das Problem. Es ist sehr schnell, da keine Datumsobjektkonvertierung stattfindet.

function getLatestDate(xs) {
   if (xs.length) {
      return xs.reduce((m, i) => (i.MeasureDate > m) && i || m, "")
               .MeasureDate;
   }
 }

Hier ist eine Version für Browser, die keine Pfeilfunktionen unterstützt:

function getLatestDateSave(xs) {
   if (xs.length) {
      return xs.reduce(function(m, i) {
         return (i.MeasureDate > m) && i || m;
      }, "").MeasureDate;
   }
 }
0
Anton Harald

Nach der Antwort von @Travis Heeter wird das Objekt zurückgegeben, das das letzte Datum enthält:

array.reduce((a, b) => (a.MeasureDate > b.MeasureDate ? a : b));

Eine robustere Lösung könnte darin bestehen, die Zeichenfolgen jedes Mal in Date -Objekte zu konvertieren. Könnte bei (sehr) großen Arrays merklich langsamer sein:

array.reduce((a, b) => {
  return new Date(a.MeasureDate) > new Date(b.MeasureDate) ? a : b;
}
0
Andy
        var dates = []; 

        dates.Push(new Date("2019/06/25")); 
        dates.Push(new Date("2019/06/26")); 
        dates.Push(new Date("2019/06/27")); 
        dates.Push(new Date("2019/06/28")); 

        function GFG_Fun() { 
            var maximumDate=new Date(Math.max.apply(null, dates)); 
            var minimumDate=new Date(Math.min.apply(null, dates)); 
        } 
0
Idrees Ramzan