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

时间:2014-08-04 07:46:20

标签: javascript sorting date

我有一系列日期,看起来像这样:

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

我想从现在8月份的角度对它们进行排序。我的意思是,第11个月比第4个月更接近。我已经考虑了很多,最后想出了this solution.
首先,它并没有真正起作用,因为连接JSON数组存在问题,但这是一个小问题。我认为,就效率或其他方面而言,这是一个非常糟糕的方法。你能想出更好的东西吗?谢谢!

3 个答案:

答案 0 :(得分:1)

您可以查看此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);

    }
  }
};

答案 1 :(得分:0)

这不会修改数组或任何原型。在比较每个元素时,只需构建日期对象即可。

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);

答案 2 :(得分:0)

可以使用以下方式对当前月份属性的距离进行排序:

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