繁体   English   中英

JavaScript 如何按最近的日期排序

[英]JavaScript how to sort date by most recent first

我正在尝试对从 API 收到的 JSON 个对象进行排序,以便首先显示最近的日期时间。 但我目前的做法是将 2022 年 12 月排序为比 2023 年 1 月更近的日期。

这是我目前正在使用的:

 result = [ { "date": "21/12/2022", "time": "10:41:10", }, { "date": "20/12/2022", "time": "12:42:21", }, { "date": "15/12/2022", "time": "09:26:02", }, { "date": "14/12/2022", "time": "10:20:54", }, { "date": "09/01/2023", "time": "18:58:17", }, { "date": "09/01/2023", "time": "18:57:34", }, { "date": "08/01/2023", "time": "12:12:38", }] if (result.length > 1) { result.sort((a, b) => { const dateTime1 = new Date(a.date + a.time); const dateTime2 = new Date(b.date + b.time); return dateTime2 - dateTime1; }); console.log(result); };

这给了我:

{date: "21/12/2022", time: "10:41:10...}
{date: "20/12/2022", time: "12:42:21...}
{date: "15/12/2022", time: "09:26:02...}
{date: "14/12/2022", time: "10:20:54...}
{date: "09/01/2023", time: "18:58:17...}
{date: "09/01/2023", time: "18:57:34...}
{date: "08/01/2023", time: "12:12:38...}

我如何以一种它认为 2022 年不比 2023 年更近的方式对其进行排序?

您的代码的问题是日期创建。

您可以使用以下代码片段创建日期,因为日期构造函数不接受 DD/MM/YYYY。

const createDate = (d, t) => {
  const [date, month, year] = d.split('/')
  const [hours, mins, secs] = t.split(':')
  return new Date(year, month - 1, date, hours, mins, secs)
}

此外, a.date + a.time不正确。 你正在连接两者但没有空间。 因此以下将是 output:

日期:“21/12/2022”
时间:“10:41:10”
Output:“21/12/202210:41:10”

以下是一个工作示例

 result = [{ "date": "21/12/2022", "time": "10:41:10", }, { "date": "20/12/2022", "time": "12:42:21", }, { "date": "15/12/2022", "time": "09:26:02", }, { "date": "14/12/2022", "time": "10:20:54", }, { "date": "09/01/2023", "time": "18:58:17", }, { "date": "09/01/2023", "time": "18:57:34", }, { "date": "08/01/2023", "time": "12:12:38", } ] const createDate = (d, t) => { const [date, month, year] = d.split('/') const [hours, mins, secs] = t.split(':') return new Date(year, month - 1, date, hours, mins, secs) } if (result.length > 1) { result.sort((a, b) => { const dateTime1 = createDate(a.date, a.time); const dateTime2 = createDate(b.date, b.time); return dateTime2 - dateTime1; }); console.log(result); };


正如@RobG所正确提到的

那应该是新的日期(年,月 - 1,日期,小时,分钟,秒),但对于排序来说,如果所有月份都为 +1 则无关紧要。

您可以将datetime转换为YYYY-MM-DD HH:MM:SS格式,然后按字典顺序对其进行排序。

 const arr = [ { "date": "21/12/2022", "time": "10:41:10", }, { "date": "20/12/2022", "time": "12:42:21", }, { "date": "15/12/2022", "time": "09:26:02", }, { "date": "14/12/2022", "time": "10:20:54", }, { "date": "09/01/2023", "time": "18:58:17", }, { "date": "09/01/2023","time": "18:57:34", }, { "date": "08/01/2023", "time": "12:12:38", }], sorted = arr.map(o => [o, o.date.split('/').reverse().join('-') + '_' + o.time]).sort((a, b) => b[1].localeCompare(a[1])).map(([o]) => o); console.log(sorted);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM