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

4
我想要比较日期和时间来操作我的数据。我需要检查对象内的 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
}]

我尝试这样做,但如何在此处使用 moment 来比较哪个是最新的呢?
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()来实现这个?

你正在尝试比较一个字符串日期格式,这样是行不通的。你可以在这里找到如何比较两个日期的想法。https://dev59.com/PnRB5IYBdhLWcg3w1Kv0 - Carljul
2
为什么不按降序对数据进行排序并获取第一个对象? - Umer Abbas
只要日期格式相同且按照从最不具体到最具体的顺序排列(即ISO 8601),您就可以将日期作为字符串进行比较。但是,您应该使用localeCompare而不是>< - Heretic Monkey
1
你不想使用 map,而是要使用 reduce - Heretic Monkey
自从它第一次发布以来就发生了变化;之前它有空字符串,现在它有 "false"(一个字符串值),而最新的条目具有 true 作为布尔值,而不是作为字符串,这是您原始代码设置的方式。 - Heretic Monkey
显示剩余3条评论
3个回答

1
你可以通过映射 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; }


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


1
不需要将其转换为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);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接