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

如何基于时间字符串值对JavaScript对象数组进行排序?

解决JavaScript对象数组按时间字符串排序的问题

我来帮你搞定这个按time字段排序的需求!你之前尝试的方法没成功,主要是因为没有正确处理时间字符串里的AM/PM优先级,或者字符串解析的细节出了问题,下面给你两种靠谱的解决方案:

方法一:转换为分钟数排序(推荐)

这种方法把时间字符串转换成一天中的总分钟数,通过数值比较来排序,逻辑清晰还避免了日期解析的兼容性问题:

// 辅助函数:把时间字符串转换为一天的总分钟数
function getTotalMinutes(timeStr) {
  // 提取时间段的起始部分(比如从"05:00 PM to 06:00 PM"中拿到"05:00 PM")
  const [startTime] = timeStr.split(' to ');
  // 拆分时间和AM/PM标识
  const [timePart, period] = startTime.split(' ');
  let [hours, minutes] = timePart.split(':').map(Number);

  // 转换为24小时制
  if (period === 'PM' && hours !== 12) {
    hours += 12;
  }
  if (period === 'AM' && hours === 12) {
    hours = 0; // 12 AM对应0点
  }

  return hours * 60 + minutes;
}

// 执行排序
var data = [
 { "avail": "3 Bookings Available", "time": "05:00 PM to 06:00 PM", "date": "2018-01-30" },
 { "avail": "3 Bookings Available", "time": "09:00 AM to 10:00 AM", "date": "2018-01-30" },
 { "avail": "3 Bookings Available", "time": "04:00 PM to 05:00 PM", "date": "2018-01-30" },
 { "avail": "3 Bookings Available", "time": "03:00 PM to 04:00 PM", "date": "2018-01-30" }
];

data.sort((a, b) => getTotalMinutes(a.time) - getTotalMinutes(b.time));
console.log(data);

运行这段代码后,就能得到你想要的排序结果:09:00 AM → 03:00 PM → 04:00 PM → 05:00 PM。

方法二:正确构造Date对象排序

如果你想用Date对象来比较,需要先正确提取时间部分,避免之前的slice错误:

var data = [
 { "avail": "3 Bookings Available", "time": "05:00 PM to 06:00 PM", "date": "2018-01-30" },
 { "avail": "3 Bookings Available", "time": "09:00 AM to 10:00 AM", "date": "2018-01-30" },
 { "avail": "3 Bookings Available", "time": "04:00 PM to 05:00 PM", "date": "2018-01-30" },
 { "avail": "3 Bookings Available", "time": "03:00 PM to 04:00 PM", "date": "2018-01-30" }
];

data.sort((a, b) => {
  // 提取起始时间并构造Date对象
  const createTimeDate = (timeStr) => {
    const [startTime] = timeStr.split(' to ');
    return new Date(`1970-01-01T${startTime}`);
  };
  return createTimeDate(a.time) - createTimeDate(b.time);
});

console.log(data);

这个方法通过拆分出正确的起始时间字符串,构造出可比较的Date对象,利用时间戳差值完成排序。

为什么你之前的方法失败了?

  • localeCompare的问题:字符串比较是按字符顺序逐位对比的,"05:00 PM"的第二个字符是"5",比"09:00 AM"的"9"小,所以会被排在前面,localeCompare不会识别AM/PM的时间优先级。
  • 之前的Date.parse方法:a.time.slice(0, -2)会得到带空格的"05:00 ",拼接后是"1970/01/01 05:00 PM"(两个空格),这种格式可能导致Date.parse解析错误,生成的时间不符合预期,自然排序出错。

内容的提问来源于stack exchange,提问作者Kaustav Chakravorty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:40:18