有没有更好的智能排序日期的方法?

Is there a better way to intelligently sort dates?

本文关键字:方法 日期 智能 更好 有没有 排序      更新时间:2023-09-26

我有一个日期数组,它看起来像这样:

var dates = [
  { day: 14, month: 4 },
  { day: 28, month: 4 },
  { day: 29, month: 11 },
  { day: 2, month: 9 }
];

我想对它们进行排序,从现在是八月的角度来看。我是说,第11个月比第4个月更近。我想了很多,最后想出了这个解决方案。首先,由于连接JSON数组的问题,它实际上不起作用,但这是一个小问题。我认为这是一种非常糟糕的方式,从效率或其他方面来说。你能想出更好的办法吗?谢谢!

您可以查看此JS Bin。其主要思想是获取当前月份,并将数组中的每个月与当前月份相抵消。然后,如果结果是负的,这意味着它是在当前的一个月之后,我试图找出它的顺序是什么。

修改后的代码如下:

Dates.prototype.sort = function() {
  var date = new Date();
  var currentMonth = date.getMonth() + 1;
  for(var j = 0; j < this.arr.length - 1; j++) {
    for (var i = 0; i < this.arr.length - 1; i++) {
      var month = this.arr[i].month - currentMonth;
      var nextMonth = this.arr[i + 1].month - currentMonth;
      if(month < 0){
        month = 12 + month;
      }
      if(nextMonth < 0){
        nextMonth = 12 + nextMonth;
      }
      if (month > nextMonth) 
        this.switch(i, i + 1); 
      else if (month == nextMonth)
        if (this.arr[i].day > this.arr[i + 1].day)
          this.switch(i , i + 1);
    }
  }
};

这不会修改数组或任何原型。这只是在比较每个元素时构建一个日期对象的问题。

var today = new Date(),
current_day = today.getDate(),
current_month = today.getMonth() + 1,
current_year = today.getFullYear(),
comparator = function(d1, d2) {
    var y1, y2, date1, date2;
    if (d1.month > current_month || (d1.month == current_month && d1.day > current_day)) {
        y1 = current_year;
    } else {
        y1 = current_year + 1;
    }
    if (d2.month > current_month || (d2.month == current_month && d2.day > current_day)) {
        y2 = current_year;
    } else {
        y2 = current_year + 1;
    }
    date1 = new Date(y1, d1.month - 1, d1.day);
    date2 = new Date(y2, d2.month - 1, d2.day);
    return date1.getTime() - date2.getTime();
};
dates.sort(comparator);

根据与当前月份的距离进行排序,可以使用:

Dates.prototype.sort = function() {
  var m = new Date().getMonth()+1
     ,tmparr = this.arr.slice().map( function(v) {
                  v.distance = Math.abs(+v.month - m); return v;
              })
  ;
  this.arr = tmparr.sort( function(a,b) { return a.distance - b.distance; } )
                   .map( function(v) { delete v.distance; return v; } );
};

见调整后的jsbin