我有一个对象数组
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"
}];
我想按数据的时间字符串值对数据进行排序,以便所需的输出如下所示:
[{
"avail": "3 Bookings Available"
"time": "09:00 AM to 10:00 AM",
"date": "2018-01-30"
},
{
"avail": "3 Bookings Available",
"time": "03:00 PM to 04:00 PM",
"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": "05:00 PM to 06:00 PM",
"date": "2018-01-30"
}]
我已经使用了 String 的排序函数#localeCompare
,但我仍然没有得到所需的输出
data.sort(function(a,b){
return a.time.localeCompare(b.time);
});
console.log(data);
即使我使用了 String#slice()
方法,通过该方法我可以使用 '1970/01/01' 作为任意值来生成有效的日期字符串日期仍然我得到了所需的输出,任何人都可以给我一种方式,我可以通过这种方式获得输出,提前致谢。
data.sort(function(a, b) {
return Date.parse('1970/01/01 ' + a.time.slice(0, -2) + ' ' + a.time.slice(-2)) - Date.parse('1970/01/01 ' + b.time.slice(0, -2) + ' ' + b.time.slice(-2))
});
示例:
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(function(a, b) {
return Date.parse('1970/01/01 ' + a.time.slice(0, -2) + ' ' + a.time.slice(-2)) - Date.parse('1970/01/01 ' + b.time.slice(0, -2) + ' ' + b.time.slice(-2))
});
console.log(data)
最佳答案
我有一个函数可以将这些时间转换为午夜以来的分钟数,大致如下:
function parseTime(time) {
var parts = time.match(/^(\d{2}):(\d{2}) (AM|PM)/i);
if (!parts) {
return NaN;
}
var adjust = parts[3].toUpperCase() == "PM" ? 12 : 0;
return (parseInt(parts[1], 10) + adjust) * 60 + parseInt(parts[2], 10);
}
那么排序就很简单了:
data.sort(function(a, b) {
return parseTime(a.time) - parseTime(b.time);
});
示例:
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"
}];
function parseTime(time) {
var parts = time.match(/^(\d{2}):(\d{2}) (AM|PM)/i);
if (!parts) {
return NaN;
}
var adjust = parts[3].toUpperCase() == "PM" ? 12 : 0;
return (parseInt(parts[1], 10) + adjust) * 60 + parseInt(parts[2], 10);
}
data.sort(function(a, b) {
return parseTime(a.time) - parseTime(b.time);
});
console.log(data);
.as-console-wrapper {
max-height: 100% !important;
}
经典的分而治之(例如,将问题分解为更小的部分)。
关于javascript - 根据时间字符串值对对象数组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48518647/