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

时间:2016-04-12 15:05:43

标签: javascript jquery angularjs

我在项目中使用angularjs。

我从服务器获取对象数组。 每个对象包含很少的属性,其中一个是日期属性。

这是我从服务器获取的数组(在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
  }
          .
          .
          .
]

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

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

9 个答案:

答案 0 :(得分:35)

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

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

其中a是对象数组。

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

通过将字符串日期映射到JS Date对象,您最终使用的解决方案如Min/Max of dates in an array?

-

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

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

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

答案 1 :(得分:5)

如果要获取整个对象,而不仅仅是日期...

因此,如果将OP的对象数组分配给a,这就是如何使用最新的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];

注意:此解决方案是上述@archyqwerty答案的扩展。他们的解决方案仅给出了对象数组中的最新日期,该解决方案为您提供了该日期所属的整个对象。

答案 2 :(得分:3)

修改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

答案 3 :(得分:3)

进一步@Travis Heeter的答案,这将返回包含最新日期的对象:

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

一个更强大的解决方案可能是每次都将字符串转换为Date对象。如果处理(非常大的)数组,速度可能会明显变慢:

array.reduce((a, b) => {
  return new Date(a.MeasureDate) > new Date(b.MeasureDate) ? a : b;
})

答案 4 :(得分:2)

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"

答案 5 :(得分:0)

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

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

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

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

答案 6 :(得分:0)

        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)); 
        } 

答案 7 :(得分:0)

进一步@TravisHeeter的回答。

您可以使用.find()方法来代替使用'filter'并获取[0]的数组索引,如下所示:

....

const mostRecentObject = a.find( e => { 
    const d = new Date( e.MeasureDate ); 
    return d.getTime() == mostRecentDate.getTime();
});

这也使代码更具性能,因为它将停止寻找结果后的查找,而不是过滤器,后者将遍历数组中的所有对象。

答案 8 :(得分:0)

这是我选择最新/最高日期的方式

var maxLastseen= obj.sort((a,b) => new Date(b.lastS).getTime() - new Date(a.lastS).getTime())[0];