如何按时间字符串值对对象数组进行排序?

时间:2016-06-08 12:42:45

标签: javascript sorting date

我有一组像这样的对象:

var example = [{
  "description": "aaa",
  "time": "12:15pm"
}, {
  "description": "bbb",
  "time": "10:10am"
}, {
  "description": "ccc",
  "time": "4:00pm"
}, {
  "description": "ddd",
  "time": "6:15pm"
}, {
  "description": "eee",
  "time": "1:10am"
}, {
  "description": "fff",
  "time": "5:00pm"
} ];

我想按time值排序。

我尝试应用this solution,它用于一组字符串值:

example.sort(function (a, b) {
  return new Date('1970/01/01 ' + a.time) - new Date('1970/01/01 ' + b.time);
});

console.log(example);

我也一直在提及Mozilla Array.prototype.sort()文档,并尝试了以下似乎不起作用的内容:

example.sort(function(a, b) {
  if (new Date(a.time) > new Date(b.time)) {
    return 1;
  }
  if (new Date(a.time) < new Date(b.time)) {
    return -1;
  }
  // a must be equal to b
  return 0;
});

console.log(example);

4 个答案:

答案 0 :(得分:2)

您生成的日期字符串无效,因此它将始终返回当前日期和时间。因此生成有效的日期字符串(例如:'1970/01/01 9:34:48 AM')然后解析并返回差异。此处 String#slice() 方法可用于生成有效的日期字符串。

&#13;
&#13;
var example = [{
  "description": "aaa",
  "time": "12:15pm"
}, {
  "description": "bbb",
  "time": "10:10am"
}, {
  "description": "ccc",
  "time": "4:00pm"
}, {
  "description": "ddd",
  "time": "6:15pm"
}, {
  "description": "eee",
  "time": "1:10am"
}, {
  "description": "fff",
  "time": "5:00pm"
}];

example.sort(function(a, b) {
  // get time time from string 
  // then get am or pm from string and append
  // both can be done using slice method
  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(example);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

space之前需要am/pm才能生成有效日期。

我们可以在比较之前将它放在sort方法中。如下所示。

example.sort(function(a,b){
  return new Date('1970/01/01 ' + a.time.replace(/(am|pm)/,' $1'))
 - new Date('1970/01/01 ' + b.time.replace(/(am|pm)/,' $1'))
})

答案 2 :(得分:0)

您可以尝试以24小时格式计算值并对其进行相应排序。

逻辑:

  1. 检查字符串
  2. 中是否存在pm
  3. 如果是,小时不是12,请向其添加12
  4. 否则返回号码
  5. &#13;
    &#13;
    var example=[{description:"aaa",time:"12:15pm"},{description:"bbb",time:"10:10am"},{description:"ccc",time:"4:00pm"},{description:"ddd",time:"6:15pm"},{description:"eee",time:"1:10am"},{description:"fff",time:"5:00pm"}];
    
    example.sort(function(a,b){
      var t1 = get24HrFormat(a.time);
      var t2 = get24HrFormat(b.time);
      return t1>t2 ? 1 : t1<t2 ? -1 : 0;
    });
    
    function get24HrFormat(str){
      var _t = str.split(/[^0-9]/g);
      _t[0] =+_t[0] + (str.indexOf("pm")>-1 && +_t[0]!==12 ? 12: 0);
      return _t.join("");
    }
      
    document.write("<pre>" + JSON.stringify(example,0,4)+ "</pre>")
    &#13;
    &#13;
    &#13;

答案 3 :(得分:0)

如果您将时间转换为小时和分钟(小时应为24小时格式),您甚至不需要使用Date构造函数。

这样的事情:

example.map(c => {
  var time = c.time.substring(0,c.time.length - 2);
  var am_pm = c.time.slice(-2);

  var hours = parseInt(time.split(':')[0]);
  var minutes = parseInt(time.split(':')[1]);

  if (hours === 12 && am_pm.toLowerCase() === 'am') {
    hours = 0;
  } else if (hours < 12 && am_pm.toLowerCase() === 'pm') {
    hours += 12;
  }

  // save hours and minutes
  c.hours = hours;
  c.minutes = minutes;

  return c;
}).sort((a,b) => {
  return (a.hours * 100 + a.minutes) - (b.hours * 100 + b.minutes); 
});

注意,这会通过添加exampleshours属性来修改minutes数组。