如何仅用sort()和switch case在JavaScript中对时间排序?
如何仅用sort()方法和switch case在JavaScript中排序时间
给定时间数组:["09:12p","08:00a","12:00a","04:00"],要仅通过sort()方法和switch case语句实现排序,得先解决时间字符串的格式转换问题——你原代码里直接调用getTime()的方式不适用,因为数组里的是带a/p或不带的时间字符串,不是Date对象,会直接报错。
解决方案步骤
- 先把各种格式的时间字符串转换成可直接比较的数值(比如总分钟数),这样排序逻辑会更清晰。
- 在
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
相关产品推荐
相关产品推荐

