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

如何仅用sort()和switch case在JavaScript中对时间排序?

如何仅用sort()方法和switch case在JavaScript中排序时间

给定时间数组:["09:12p","08:00a","12:00a","04:00"],要仅通过sort()方法和switch case语句实现排序,得先解决时间字符串的格式转换问题——你原代码里直接调用getTime()的方式不适用,因为数组里的是带a/p或不带的时间字符串,不是Date对象,会直接报错。

解决方案步骤

  1. 先把各种格式的时间字符串转换成可直接比较的数值(比如总分钟数),这样排序逻辑会更清晰。
  2. 在sort()的回调函数里用switch case判断时间的大小关系,返回对应的排序值。

完整代码示例

const timeArray = ["09:12p","08:00a","12:00a","04:00"];

// 把时间字符串转成总分钟数的辅助函数
function convertTimeToMinutes(timeStr) {
  let [hours, minutes] = timeStr.split(':');
  let period = 'a'; // 默认按上午处理

  // 分离分钟和上/下午标识
  if (minutes.includes('a') || minutes.includes('p')) {
    period = minutes.slice(-1);
    minutes = minutes.slice(0, -1);
  }

  hours = parseInt(hours, 10);
  minutes = parseInt(minutes, 10);

  // 处理12小时制的转换规则
  if (period === 'p' && hours !== 12) {
    hours += 12;
  } else if (period === 'a' && hours === 12) {
    hours = 0;
  }

  return hours * 60 + minutes;
}

// 使用sort和switch case实现排序
timeArray.sort((a, b) => {
  const timeA = convertTimeToMinutes(a);
  const timeB = convertTimeToMinutes(b);

  switch (true) {
    case timeA < timeB:
      return -1; // a排在b前面
    case timeA > timeB:
      return 1; // a排在b后面
    default:
      return 0; // 时间相等,顺序不变
  }
});

console.log(timeArray); // 输出: ["12:00a", "04:00", "08:00a", "09:12p"]

扩展多条件排序(对应你原代码的日期排序需求)

如果你的数组元素是包含时间和日期的对象,比如原代码里的clockInEndTime和scheduledStartDate,可以在时间相等时,嵌套switch case处理日期排序:

const timeObjects = [
  { clockInEndTime: "09:12p", scheduledStartDate: "2024-01-01" },
  { clockInEndTime: "08:00a", scheduledStartDate: "2024-01-02" },
  { clockInEndTime: "12:00a", scheduledStartDate: "2024-01-01" },
  { clockInEndTime: "12:00a", scheduledStartDate: "2024-01-02" }
];

timeObjects.sort((a, b) => {
  const timeA = convertTimeToMinutes(a.clockInEndTime);
  const timeB = convertTimeToMinutes(b.clockInEndTime);

  switch (true) {
    case timeA < timeB:
      return -1;
    case timeA > timeB:
      return 1;
    default:
      // 时间相同时按日期排序
      const dateA = new Date(a.scheduledStartDate || a.date);
      const dateB = new Date(b.scheduledStartDate || b.date);
      switch (true) {
        case dateA < dateB:
          return -1;
        case dateA > dateB:
          return 1;
        default:
          return 0;
      }
  }
});

原代码的问题说明

你原代码里直接调用a.clockInEndTime.getTime(),但如果clockInEndTime是字符串类型(而非Date对象),会抛出TypeError: a.clockInEndTime.getTime is not a function的错误。必须先把时间字符串转换成可比较的格式(比如总分钟数或Date对象),再进行排序比较。

内容的提问来源于stack exchange,提问作者RAHUL PATHANIA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:46:08