web-dev-qa-db-fra.com

Quelle est la manière élégante d’obtenir la dernière date du tableau d’objets côté client?

J'utilise angularjs dans le projet.

Je reçois un tableau d'objets du serveur . Chaque objet contient peu de propriétés et l'une d'entre elles est la propriété date.

Voici le tableau (en json) que je reçois du serveur:

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

J'ai besoin d'obtenir la dernière date du tableau.

Quelle est la manière élégante d'obtenir la dernière date d'un tableau d'objets?

22
Michael

Une façon propre de le faire serait de convertir chaque date en Date() et de prendre le maximum

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

a est le tableau d'objets.

Cela permet de mapper chacun des objets du tableau avec une date créée avec la valeur MeasureDate. Ce tableau mappé est ensuite appliqué à la fonction Math.max pour obtenir la date la plus récente et le résultat est converti en une date.

En mappant les dates de chaîne aux objets JS Date, vous utilisez une solution telle que Min/Max de dates dans un tableau?

-

Une solution moins propre consisterait simplement à mapper les objets sur la valeur MeasureDate et à trier le tableau de chaînes. Cela fonctionne uniquement en raison du format de date que vous utilisez.

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

Si les performances sont une préoccupation, vous pouvez vouloir reduce le tableau pour obtenir le maximum au lieu d'utiliser sort et reverse.

28
arcyqwerty

Modification à la réponse de Anton Harald: Le tableau que j'ai utilise utilise ModDate au lieu de MeasureDate. Je choisis la date la plus récente. Cela marche.

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

m = accumulateur, v = courant, i = index 

Environnement: 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)"

Cette fonction renvoie la dernière date sous forme d'objet de date JavaScript. Vous pouvez également le transformer en une chaîne ISO (le format de vos données source) avec la méthode Date-Object toISOString ().

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

Comme vous pouvez le constater, le résultat de la méthode inclut toujours zéro milliseconde à la fin. Si vous avez besoin de votre chaîne de données ISO d'origine, vous souhaiterez peut-être utiliser la fonction suivante:

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

Si vous voulez obtenir l'objet entier, pas seulement la date ...

Donc, si le tableau d'objets d'OP a été assigné à a, voici comment vous obtenez l'objet avec la plus récente 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];

Remarque: Cette solution est une extension de la réponse de @ archyqwerty ci-dessus. Leur solution n’a donné que la date la plus récente d’un tableau d’objets, cette solution vous donne l’objet entier dont la date était membre.  

1
Travis Heeter

Inspiré par de nombreuses suggestions et commentaires de ce fil, voici une autre solution au problème. C'est très rapide, car il n'y a pas de conversion d'objet de date.

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

Voici une version pour les navigateurs ne supportant pas les fonctions de flèche:

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