Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从客户端的对象数组中获取最新日期的优雅方式是什么?_Javascript_Jquery_Angularjs - Fatal编程技术网

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

Javascript 从客户端的对象数组中获取最新日期的优雅方式是什么?,javascript,jquery,angularjs,Javascript,Jquery,Angularjs,我在项目中使用angularjs 我从服务器获取对象数组。 每个对象包含几个属性,其中一个是日期属性 以下是我从服务器获取的数组(json): [ { "Address": 25, "AlertType": 1, "Area": "North", "MeasureDate": "2019-02-01T00:01:01.001Z", "MeasureValue": -1 }, { "Address": 26, "AlertType

我在项目中使用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
  }
          .
          .
          .
]
我需要从阵列中获取最新日期


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

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

ES6:

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

new Date(Math.max(...a.map(e => new Date(e.MeasureDate))));
new Date(Math.max.apply(null, a.map(function(e) {
  return new Date(e.MeasureDate);
})));
其中
a
是对象数组

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

通过将字符串日期映射到JS Date对象,您最终将使用如下解决方案

--

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

a.map(function(e) { return e.MeasureDate; }).sort().reverse()[0]
如果性能是一个问题,您可能希望
减少
数组以获得最大值,而不是使用
排序
反向

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日期对象返回。还可以使用日期对象方法toISOString()将其转换为ISO字符串(源数据的格式)

正如您所看到的,该方法的结果最后总是包含零毫秒。如果因此需要原始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"
函数getLatestDate2(数据){ var sorted=data.map(函数(项){ var MeasureDate=项目被测日期; 返回{original_str:MeasureDate, in_ms:(新日期(MeasureDate)).getTime()} }).sort(函数(项1、项2){ 返回(项目1.in\ms<项目2.in\ms) }); //最新 var latest=已排序[0]; 返回最新的.original_str; } getLatestDate2(数据);//“2014-10-04T16:10:00”
受本帖中许多建议和评论的启发,下面是解决此问题的另一个解决方案。它非常快,因为没有日期对象转换

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

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

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

如果OP的对象数组被分配给
a
,这就是您获取具有最新日期的对象的方式:

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];
  • 从对象数组中获取日期
  • 新日期
    应用于每个日期,生成对象
  • 查找最近的
  • 我们已经找到了最近的日期,现在我们需要该对象
  • a.filter
    在原始
    a
    数组中循环
  • 我们需要一些方法来比较日期,所以我们使用,它返回自1970年1月1日以来的毫秒数。这将说明时间(如果定义的话)和日期
  • 找到正确的日期后,返回
    true
    ,而
    .filter
    只提供该对象

  • 注:此解决方案是上述@archyqwerty答案的扩展。他们的解决方案只提供了一组对象中最近的日期,这个解决方案提供了该日期所属的整个对象

    根据@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;
    });
    

    还有@TravisHeeter的回答

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

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

    这也使代码的性能更高,因为它在找到结果后将停止查找,而不是对数组中的所有对象进行迭代的筛选。

    这就是我选择lasest/highest date的方式

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

    循环查找最新日期。@epascarello,我是否必须将其转换为日期javascript对象。是的,您需要将字符串转换为日期。您不需要转换它。可以按原样订购。而且,事实上,有一些论点认为,引入转换为引入更多可能出现问题的领域(解析等)打开了大门。您不必转换它,因为您选择了特定的格式。我认为最好进行转换,因为如果您的应用程序使用不同的格式或接受多种格式,那么这可能会中断,而将其解析为日期,然后排序可以确保它确实是最新的日期(不一定是最后排序的字符串)。例如,如果您开始接受MM/DD/YYYY日期,那么字符串顺序可能与日期顺序截然不同。有趣的解决方案。不知道可以立即将日期对象应用于Math.max.ES6:新日期(Math.max(…a.map(a=>newdate(a.MeasureDate));如何取回整个对象而不仅仅是日期?可能有一种更简单的方法,但我必须编写另一个函数来获取对象:因此,您的函数给出了一个日期,假设它被分配给var
    mostRecentDate
    。然后我可以这样做来获取对象:
    var mostRecentObject=a.filter(e=>{var d=newdate(e.MeasureDate);返回d.getTime()==mostRecentDate.getTime();})[0]你是一个传奇人物你在使用哪个浏览器?也许它不支持箭头功能。请参见此处的更多详细信息:添加了