如何在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);
说明
- 不修改原数组:使用扩展运算符
[...combined]复制原数组,避免排序操作影响原数据 - 时间解析:JavaScript的
Date构造函数可直接解析ISO标准的日期/时间字符串,包括仅日期的YYYY-MM-DD(会默认设为当日0点)和带时区的dateTime格式 - 排序逻辑:通过
getTime()获取时间戳(从1970-01-01 UTC开始的毫秒数),用两个时间戳的差值作为排序依据,差值为负则前者排在前面,实现“最早在前”的排序效果
内容的提问来源于stack exchange,提问作者ZF-Dev
相关产品推荐
相关产品推荐

