javascript - 根据时间字符串值对对象数组进行排序?

标签 javascript arrays string sorting 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"
  }];

我想按数据的时间字符串值对数据进行排序,以便所需的输出如下所示:

 [{
    "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/

相关文章:

javascript - 即使数组已更改且指定了 v-key,VueJS 也不会重新呈现列表

javascript - IE 和 Edge 中下拉菜单的黑色边框问题

string - VBA 修剪留下前导空白

c - 删除一个字符串中出现的另一个字符串

javascript - Webpack 中的 Rule.issuer。它有哪些属性?

c - 将 C 数组拆分为 n 个相等的部分

c++ - 传递给 C++ 函数的数组大小?

javascript - 将一个数组值连续复制到第二个数组值

java - 搜索并保存 html 代码中的指定链接

javascript - jquery添加点击事件并移除给别人