You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中基于日期对对象数组进行排序

按日期/时间对对象数组排序的解决方案

原数组结构

const combined = [
{
 id: "1",
 desc: "Description One",
 start: {
         date: "2024-11-01",
        }
},
{
 id: "2",
 desc: "Description Two",
 start: {
         dateTime: "2026-08-13T17:00:00+02:00",
        }
},
{
 id: "3",
 desc: "Description Three",
 start: {
         date: "2023-03-28",
        }
},
{
 id: "4",
 desc: "Description Four",
 start: {
         dateTime: "2026-08-13T15:00:00+02:00",
        }
}
]

需求说明

对象的start属性下仅存在两种字段之一:

  • date:仅包含日期的字符串(格式YYYY-MM-DD)
  • dateTime:带时区的完整时间戳字符串(格式YYYY-MM-DDTHH:MM:SS±HH:MM)

需要将数组按最早日期优先排序,若为同一天则按最早时间优先,排序后最早的元素位于数组索引[0]。

期望排序结果

[
{
 id: "3",
 desc: "Description Three",
 start: {
         date: "2023-03-28",
        }
},
{
 id: "1",
 desc: "Description One",
 start: {
         date: "2024-11-01",
        }
},
{
 id: "4",
 desc: "Description Four",
 start: {
         dateTime: "2026-08-13T15:00:00+02:00",
        }
},
{
 id: "2",
 desc: "Description Two",
 start: {
         dateTime: "2026-08-13T17:00:00+02:00",
        }
}
]

解决方案

利用Array.prototype.sort(),将日期/时间字符串转换为可比较的时间戳进行排序:

// 复制原数组避免修改原数据,若无需保留原数组可直接用combined.sort(...)
const sortedCombined = [...combined].sort((a, b) => {
  // 获取当前对象的时间字符串(优先取dateTime,无则取date)
  const getTimeStr = item => item.start.dateTime || item.start.date;
  
  // 转换为时间戳(毫秒数)并比较差值
  return new Date(getTimeStr(a)).getTime() - new Date(getTimeStr(b)).getTime();
});

console.log(sortedCombined);

说明

  1. 不修改原数组:使用扩展运算符[...combined]复制原数组,避免排序操作影响原数据
  2. 时间解析:JavaScript的Date构造函数可直接解析ISO标准的日期/时间字符串,包括仅日期的YYYY-MM-DD(会默认设为当日0点)和带时区的dateTime格式
  3. 排序逻辑:通过getTime()获取时间戳(从1970-01-01 UTC开始的毫秒数),用两个时间戳的差值作为排序依据,差值为负则前者排在前面,实现“最早在前”的排序效果

内容的提问来源于stack exchange,提问作者ZF-Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:34:50