比较对象数组中的日期和时间

Posted

技术标签:

【中文标题】比较对象数组中的日期和时间【英文标题】:Compare date and time in array of objects 【发布时间】:2021-11-21 11:23:29 【问题描述】:

我正在尝试比较日期和时间来处理我的数据。我需要通过检查对象内的updated_at 键来检查哪个是最新数据。

下面我给出了场景。

// below is my data to be manipulat
[
  "is_latest": "",
  "created_at": "2021-09-21T21:24:05.000Z",
  "updated_at": "2021-09-21T17:53:29.000Z"
, 
  "is_latest": "",
  "created_at": "2021-09-22T21:24:05.000Z",
  "updated_at": "2021-09-22T17:53:29.000Z"
, 
  "is_latest": "",
  "created_at": "2021-09-29T21:24:05.000Z",
  "updated_at": "2021-09-29T17:53:29.000Z" // this is the latest data
]

我正在尝试这样,但是如何在这里使用时刻来比较哪个是最新的。

for (var i = 0; i < data.length; i++) 
  if (data[i].updated_at > data[i + 1].updated_at) 
    data.is_latest = "true"
  

但我没有得到如下预期的结果。

[
  "is_latest": "false",
  "created_at": "2021-09-21T21:24:05.000Z",
  "updated_at": "2021-09-21T17:53:29.000Z"
, 
  "is_latest": "false",
  "created_at": "2021-09-22T21:24:05.000Z",
  "updated_at": "2021-09-22T17:53:29.000Z"
, 
  "is_latest": true,
  "created_at": "2021-09-29T21:24:05.000Z",
  "updated_at": "2021-09-29T17:53:29.000Z"
]

如何使用map() 或reduce() 来做到这一点?

【问题讨论】:

您正在尝试比较字符串日期格式。所以这行不通。您可以在这里了解如何比较 2 个日期。 ***.com/questions/492994/… 为什么不按降序对数据进行排序,得到第一个对象 您可以将日期作为字符串进行比较,只要它们采用相同的格式,并且该格式按照从最不特定到大多数(即 ISO 8601)的顺序排列,就像这些一样。不过,您应该使用localeCompare 而不是&gt;&lt; 你不想使用map;你想使用reduce 我是这个 es6 的新手。请您帮忙实现预期的结果。 【参考方案1】:

您应该检查它的地图并获取最大日期索引。然后将其值设置为true;

var data = [

  "is_latest": "",
  "created_at": "2021-09-21T21:24:05.000Z",
  "updated_at": "2021-09-21T17:53:29.000Z"
,

  "is_latest": "",
  "created_at": "2021-09-22T21:24:05.000Z",
  "updated_at": "2021-09-22T17:53:29.000Z"
,

  "is_latest": "",
  "created_at": "2021-09-29T21:24:05.000Z",
  "updated_at": "2021-09-29T17:53:29.000Z"
,

  "is_latest": "",
  "created_at": "2021-09-30T21:24:05.000Z",
  "updated_at": "2021-09-30T17:53:29.000Z"

]
var maxDateIndex = 0;

var newData = data.map((item, index) => 
  if(item.updated_at > data[maxDateIndex].updated_at) 
      maxDateIndex = index;
  item.is_latest = "false";
  return item;
);

newData[maxDateIndex].is_latest = "true";
console.log(newData);

【讨论】:

【参考方案2】:

无需转换为Date 对象并返回;坚持使用字符串并使用localeCompare。然后只需对值进行反向排序并选择第一个。

let data = [
    "is_latest": "",
    "created_at": "2021-09-21T21:24:05.000Z",
    "updated_at": "2021-09-21T17:53:29.000Z"
  ,
  
    "is_latest": "",
    "created_at": "2021-09-22T21:24:05.000Z",
    "updated_at": "2021-09-22T17:53:29.000Z"
  ,
  
    "is_latest": "",
    "created_at": "2021-09-29T21:24:05.000Z",
    "updated_at": "2021-09-29T17:53:29.000Z" // this is the latest data
  
];
const trueVal = true; // change to "true" if you want a string
const falseVal = false; // change to "false" if you want a string
data.sort((a, b) => b.updated_at.localeCompare(a.updated_at));
data[0].is_latest = trueVal;
data.filter(datum => !datum.is_latest).forEach(datum => datum.is_latest = falseVal);
console.log(data);

【讨论】:

【参考方案3】:

您可以通过映射updated_at 字段值并将它们分布在Math.max 调用中来定位最新日期。将 Unix 纪元转换回日期后,您可以使用Array.prototype.find 定位它并将is_latest 设置为true

注意:由于您的日期采用 ISO 8601 格式,因此将它们转换回来就像调用 Date.prototype.toISOString 一样简单。

const data = [
  "is_latest": false,
  "created_at": "2021-09-21T21:24:05.000Z",
  "updated_at": "2021-09-21T17:53:29.000Z"
, 
  "is_latest": false,
  "created_at": "2021-09-22T21:24:05.000Z",
  "updated_at": "2021-09-22T17:53:29.000Z"
, 
  "is_latest": false,
  "created_at": "2021-09-29T21:24:05.000Z",
  "updated_at": "2021-09-29T17:53:29.000Z" // this is the latest data
];

const latestDate = new Date(Math.max(...(data.map(( updated_at ) =>
  new Date(updated_at))))).toISOString();

data.find(( updated_at ) => updated_at === latestDate).is_latest = true;

console.log(data);
.as-console-wrapper  top: 0; max-height: 100% !important; 

【讨论】:

以上是关于比较对象数组中的日期和时间的主要内容,如果未能解决你的问题,请参考以下文章

如何比较python中的日期时间对象?

如何将 Fullcalendar 插件中的日期与日期数组进行比较

如何比较pyspark中的日期时间行对象

iOS小技能:对象数组按照日期分组和排序,使用块代码实现数组排序和乱序。

iOS小技能:对象数组按照日期分组和排序,使用块代码实现数组排序和乱序。

AngularJS forEach 比较下一个索引数组