我有一系列日期,看起来像这样:
var dates = [
{ day: 14, month: 4 },
{ day: 28, month: 4 },
{ day: 29, month: 11 },
{ day: 2, month: 9 }
];
我想从现在8月份的角度对它们进行排序。我的意思是,第11个月比第4个月更接近。我已经考虑了很多,最后想出了this solution.
首先,它并没有真正起作用,因为连接JSON数组存在问题,但这是一个小问题。我认为,就效率或其他方面而言,这是一个非常糟糕的方法。你能想出更好的东西吗?谢谢!
答案 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