我在javascript中有一个看起来像这样的数组
Array[9]
0: "01/06/2016"
1: "02/06/2016"
2: "23/05/2016"
3: "24/05/2016"
4: "25/05/2016"
5: "26/05/2016"
6: "27/05/2016"
7: "28/05/2016"
8: "31/05/2016"
length: 9__proto__: Array[0]
我想订购它们,所以最早的日期是第一个,最近的日期是最后的。 我试过了
days.sort(function(a,b) {
return new Date(a).getTime() - new Date(b).getTime()
});
但我猜是因为日期的格式?这不起作用。 我还能尝试什么?
预期产出
Array[9]
0: "23/05/2016"
1: "24/05/2016"
2: "25/05/2016"
3: "26/05/2016"
4: "27/05/2016"
5: "28/05/2016"
6: "31/05/2016"
7: "01/06/2016"
8: "02/06/2016"
length: 9__proto__: Array[0]
答案 0 :(得分:4)
您可以将字符串切换为年,月,日,并使用该字符串创建比较日期。
new Date("01/06/2016")
不会按您的想法进行解析。结果实际上是 Jan 06 2016
。
days = ["01/06/2016", "02/06/2016", "23/05/2016", "24/05/2016", "25/05/2016", "26/05/2016", "27/05/2016", "28/05/2016", "31/05/2016"];
days.sort(function(a, b) {
aArr = a.split('/');
bArr = b.split('/');
return new Date(aArr[2], Number(aArr[1])-1, aArr[0]).getTime() - new Date(bArr[2], Number(bArr[1])-1, bArr[0]).getTime()
});
console.log(days);

答案 1 :(得分:2)
这是因为在你的情况下Date使用的格式是MM / DD / YYYY
new Date("01/06/2016");
> Wed Jan 06 2016 00:00:00 GMT+0100 (Mitteleuropäische Zeit)
另见http://www.w3schools.com/js/js_date_formats.asp
但是从您的列表中我假设您的日期是DD / MM / YYYY格式。
3种可能的解决方案:
在列表中使用其他格式
您可以拆分字符串并在排序功能中通过new Date(year, month, day);
创建日期。
使用高级日期/时间库,我推荐moment.js http://momentjs.com/
答案 2 :(得分:0)
var array= [ "01/06/2016" ,
"02/06/2016" ,
"23/05/2016" ,
"24/05/2016" ,
"25/05/2016" ,
"26/05/2016" ,
"27/05/2016" ,
"28/05/2016" ,
"31/05/2016" ];
array.sort(function (a, b) {
var dateParts1 = a.split("/");
var dateParts2 = b.split("/");
var dateA=dateParts1[2]*360+ dateParts1[1]*30+ dateParts1[0];
var dateB=dateParts2[2]*360+ dateParts2[1]*30+ dateParts2[0];
if (dateA > dateB) {
return 1;
}
if (dateA < dateB) {
return -1;
}
return 0;
});
答案 3 :(得分:0)
请分离解析和排序操作并缓存中间值。
days = ["01/06/2016", "02/06/2016", "23/05/2016", "24/05/2016", "25/05/2016", "26/05/2016", "27/05/2016", "28/05/2016", "31/05/2016"];
days.map(v => { //parsing
var a = v.split("/");
return {
value: v,
ts: +new Date(+a[2], a[1]-1, +a[0])
}
})
.sort((a,b) => a.ts - b.ts) //sorting
.map(o => o.value); //returning the associated (input-)values
对于输入数组中的n
项,排序函数最多可调用n * (n-1)
次,具体取决于实现的排序算法。
在这种情况下,在最坏的情况下解析这样的字符串最多144次。
在最好的情况下(数组已经排序),这里的其他实现必须为这9个项目解析至少16次。 (8个比较* 2个要解析的字符串)
这可能听起来不太多(但),但这些数字呈指数增长。
答案 4 :(得分:0)
请试试这个:
var array = ["01/06/2016", "02/06/2016", "23/05/2016", "24/05/2016", "25/05/2016", "26/05/2016", "27/05/2016", "28/05/2016", "31/05/2016"];
function dateString2Date(dateString) {
var dt = dateString.split(/\//);
return new Date(dt[2]+"-"+dt[1]+"-"+dt[0]);
}
for(var i =0 ; i<=array.length-2;i++){
for(var j=i+1; j<=array.length-1;j++){
if(dateString2Date((array[i])).getTime()/1000> dateString2Date((array[j])).getTime()/1000){
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
console.log(array)
&#13;