如何按日期对数组进行排序?

How to sort array by date?

我有以下数据:

const data = 
[{date: "2022-05-10 13:36:00", open: 155.535, low: 155.4, high: 155.67, close: 155.44},
{date: "2022-05-10 13:35:00", open: 155.23, low: 155.2102, high: 155.62, close: 155.53},
{date: "2022-05-10 13:34:00", open: 154.97, low: 154.96, high: 155.29, close: 155.22}];

我正在使用以下代码按日期(从旧到新)对数据进行排序:

const data = 
[{date: "2022-05-10 13:36:00", open: 155.535, low: 155.4, high: 155.67, close: 155.44},
{date: "2022-05-10 13:35:00", open: 155.23, low: 155.2102, high: 155.62, close: 155.53},
{date: "2022-05-10 13:34:00", open: 154.97, low: 154.96, high: 155.29, close: 155.22}];
console.log(Object.entries(data).sort((([, a], [, b]) => {
    return new Date(a.date) - new Date(b.date)
  })).map(i=>{ return i[1]}))

在chrome中渲染得很好,但在safari中,它不会工作,会保持原来的顺序。

我的问题是是什么造成了这种差异以及如何使排序算法在所有浏览器中工作?

谢谢!

P.S。我确实检查了这个问题,,但答案表明 The sort is not necessarily stable,但根据 mdn 现在:

Since version 10 (or EcmaScript 2019), the specification dictates that Array.prototype.sort is stable.

我错过了什么?

在 Safari 中,不支持 "YYYY-MM-DD hh:mm:ss" 日期格式,对这样的值调用 new Date() 将始终 return Invalid Date。排序失败本质上是因为所有值在日期转换后都相同。

要解决这个问题,您可以

  • 使用 "YYYY/MM/DD hh:mm:ss" 日期格式
    前任。 new Date('YYYY-MM-DD hh:mm:ss'.replace(/-/g, "/"))

  • 使用 moment 进行字符串到日期的转换(如果您在代码中的其他任何地方不需要 moment,这可能有点矫枉过正)

  • 比较ISO日期字符串,因为它们的字典顺序与时间顺序相同(如评论中@gre_gor所述)

  • "YYYY-MM-DD hh:mm:ss" 中的 space 替换为 T,以获得 "YYYY-MM-DDThh:mm:ss" 这是另一种可接受的格式(如链接线程中所述)

可能还有其他解决方案,但您明白了。

供参考:
Invalid date in safari
https://techtalkbook.com/javascripts-new-date-does-not-work-on-ie-and-safari/

您已经按照适合排序的方式对日期进行了格式化。所以我们可以为他们写一个简单的排序器:

const sortByDate = (data) => 
  data .sort (({date: a}, {date: b}) => a < b ? -1 : a > b ? 1 : 0)

const data = [{date: "2022-05-10 13:36:00", open: 155.535, low: 155.4, high: 155.67, close: 155.44}, {date: "2022-05-10 13:35:00", open: 155.23, low: 155.2102, high: 155.62, close: 155.53}, {date: "2022-05-10 13:34:00", open: 154.97, low: 154.96, high: 155.29, close: 155.22}]

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

您不能使用减法对字符串进行排序,但可以进行字典排序。这与 ISO-8601 格式非常相似,只是中间的 T 被 space 代替了。它将以相同的方式排序。