从客户端的对象数组中获取最新日期的优雅方法是什么?

我在项目中使用angularjs。

我从服务器获取了一系列对象。 每个对象包含很少的属性,其中一个属性是date属性。

这是我从服务器获取的数组(在json中):

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

我需要从arrays中获取最新日期。

从对象数组中获取最新日期的优雅方法是什么?

一个干净的方法是将每个日期转换为Date()并取最大值

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

其中a是对象数组。

这样做是将数组中的每个对象映射到使用MeasureDate值创建的日期。 然后将此映射数组应用于Math.max函数以获取最新日期,并将结果转换为日期。

通过将字符串日期映射到JS Date对象,您最终会使用数组中的最小/最大日期等解决方案?

一个不太干净的解决方案是简单地将对象映射到MeasureDate的值MeasureDate字符串数组进行排序。 这仅适用于您使用的特定日期格式。

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

如果需要考虑性能,您可能希望reduce数组以获得最大值,而不是使用sortreverse

修改Anton Harald的答案:我使用的数组使用的是ModDate而不是MeasureDate。 我选择的是最近的日期。 这很有效。

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

m =累加器,v =当前,i =索引

环境: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)" 

此函数将最新日期作为JavaScript日期对象返回。 您还可以使用Date-Object方法将其转换为ISO-String(源数据的格式)toISOString()。

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

正如您所看到的,该方法的结果最终总是包含零毫秒。 如果您需要原始ISO数据字符串,则可能需要使用以下函数:

 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" 

受到该主题中许多建议和评论的启发,这是该问题的另一种解决方案。 它非常快,因为没有日期对象转换。

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

这是浏览器不支持箭头function的版本:

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