如何基于时间字符串值对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
相关产品推荐
相关产品推荐

