array.sort()按日期字符串排序,javascript

array.sort()按日期字符串排序,javascript,javascript,arrays,sorting,date,Javascript,Arrays,Sorting,Date,我一直在使用javascript排序函数array.sort,方法是传入一个比较函数,使数组的arrayarray按date desc排序 以下是我的测试脚本: var obj ={data:[["20150130"],["20150131"],["20150201"],["20150202"],["20150203"],["20140101"]]};// actually there are some values else in the inner array console.log("b

我一直在使用javascript排序函数array.sort,方法是传入一个比较函数,使数组的arrayarray按date desc排序

以下是我的测试脚本:

var obj ={data:[["20150130"],["20150131"],["20150201"],["20150202"],["20150203"],["20140101"]]};// actually there are some values else in the inner array

console.log("before sort",obj.data);
obj.data.sort(function(o1,o2){//sort the data
    //if(o1[0]==o2[0]) return 0;
    var year1=o1[0].substring(0,4);
    var month1=o1[0].substring(4,6);
    var day1=o1[0].substring(6,8);

    var year2=o2[0].substring(0,4);
    var month2=o2[0].substring(4,6);
    var day2=o2[0].substring(6,8);

    //console.log("date1 : ",new Date(year1,month1,day1));
    //console.log("date2 : ",new Date(year2,month2,day2));
    //console.log(-(new Date(year1,month1,day1) -new Date(year2,month2,day2)));

    return -(new Date(year1,month1,day1)-new Date(year2,month2,day2));
   //return -(new Date(parseInt(year1,10), parseInt(month1,10)-1, parseInt(day1,10)) -new Date(parseInt(year2), parseInt(month2,10)-1, parseInt(day2,10)));   // is messing up too

});

console.log("after sort",obj.data);
结果:

before sort [["20150130"], ["20150131"], ["20150201"], ["20150202"], ["20150203"], ["20140101"]]

after sort [["20150203"], ["20150131"], ["20150202"], ["20150130"], ["20150201"], ["20140101"]]
谢谢大家!

更新 我用

funtion(o1,02){
    if (o2 ==o1) return 0;
    return o1 > o2 ? -1 :1;
}

这似乎是可行的,但我仍然希望得到一个明确的答案,解释为什么原始代码根本不起作用。谢谢大家!

因为您的日期字符串是YYYYMMDD,日期组件是按优先级顺序排列的,并且它们是零填充到固定长度的,所以您根本不需要解析或使用自定义排序。您只需按字符串排序即可:

obj.data.sort().reverse();
工作演示:

在您的解决方案中,我看到您正在向日期构造函数传递字符串而不是数字,对于月份值,您正在传递范围为1到12的值,而不是0到11的值。我不确定是否还有其他问题。

这应该可以:

obj.data.sort(function(o1,o2){//sort the data
    //if(o1[0]==o2[0]) return 0;
    var year1=o1[0].substring(0,4);
    var month1=o1[0].substring(4,6);
    var day1=o1[0].substring(6,8);

    var year2=o2[0].substring(0,4);
    var month2=o2[0].substring(4,6);
    var day2=o2[0].substring(6,8);

    console.log("date1 : ",new Date(year1,month1,day1));
    console.log("date2 : ",new Date(year2,month2,day2));
    console.log(-(new Date(year1,month1,day1) -new Date(year2,month2,day2)));

    Date d1 = new Date(year1,month1,day1);
    Date d2 = new Date(year2,month2,day2);
    if (d1 < d2)
        return -1;
    if (d1 == d2)
        return 0;
    return 1;
});
但是有人已经建议用数字代替字符串,你可以像普通数字一样对它进行排序。

这个怎么样

var obj={数据:[[20150130]、[20150131]、[20150201]、[20150202]、[20150203]、[20140101]}; obj.data=obj.data.sortfunctiond1,d2{ 返回新日期+d1[0]<新日期+d2[0] };
document.writeobj.data.join',';//只是为了测试你让自己的生活变得不必要的艰难。只需按每个子数组的第一个也是唯一一个值对数组进行排序:

obj.data.sort(function(x, y) {
    return x[0] < y[0] ? -1 : +1;
});

你的约会就像数字一样。为什么不把它们解析成数字呢?你的问题得到回答了吗?如果是,请选择其中一个答案,并通过单击答案左侧的绿色复选标记将其标记为最佳答案。由于您的日期字符串为YYYYMMDD,因此日期组件按优先级顺序排列,并且它们以固定长度补零,请更新您的答案,以说明这是如何产生我的问题的?那我就接受你的回答。谢谢大家!@Jaskey-填充并没有引起你的问题。这只是一个事实,我可以依靠它来创建一个非常简单的排序方法。我没有详细分析你的代码来发现它的所有错误。我确实看到您正在向日期构造函数传递字符串,而不是数字,并将月份作为值从1-12传递,而日期构造函数期望0-11。我不确定还有什么可能是错误的,但即使我使用return-new-DateparseIntyear1,10,parseIntmonth1,10-1,parseIntday1,10-new-DateparseIntyear2,parseIntmonth2,10-1,parseIntday2,10;它仍在混乱中。这将不起作用,因为中的日期是一个元素数组,排序不知道如何比较。@torazaburo-表示,如果不提供回调,它将按元素的toString转换进行排序。sort因此起作用。包含字符串的单元素数组上的toString就是该字符串;您可以使用var。您还应该向日期构造函数传递数字,而不是字符串。当日期已经是可排序的字符串格式时,为什么还要费尽心机自己解析日期?比较函数和d1[0]o2?-1:1;}',但我很好奇为什么原始代码不起作用,我想我错过了什么或者出错了。所以我希望得到一个答案。
obj . data . 
    map(function(subarray) { return subarray[0]; }) .
    sort() .
    map(function(date) { return [date]; });