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?
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);
})));
où 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
.
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
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"
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.
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;
}
}