array.sort()按日期字符串搞乱,javascript

时间:2015-02-15 08:51:01

标签: javascript arrays sorting date

我坚持使用javascript排序函数array。通过传入比较函数来排序,使数组(数组数组)按日期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;
}

它似乎有用,虽然我仍然希望得到一个清晰的答案,为什么原始代码根本不起作用。谢谢!

4 个答案:

答案 0 :(得分:0)

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

obj.data.sort().reverse();

工作演示:http://jsfiddle.net/jfriend00/q4cddpx3/


在你的解决方案中,我看到你将字符串而不是数字传递给Date()构造函数,对于月值,你传递的值在1到12而不是0到11之间。我不是确定是否还有其他错误。

答案 1 :(得分:0)

这应该有效:

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

但是有人已经建议用数字替换字符串,你可以像普通数字一样对它进行排序。

答案 2 :(得分:0)

这个怎么样

&#13;
&#13;
var obj ={data:[["20150130"],["20150131"],["20150201"],["20150202"],["20150203"],["20140101"]]};

obj.data = obj.data.sort(function(d1, d2){
   return (new Date(+d1[0])) < (new Date(+d2[0]))
});

document.write(obj.data.join(',')); // Just for test
&#13;
&#13;
&#13;

答案 3 :(得分:0)

你为自己创造了不必要的生活。您只需要按每个子数组的第一个也是唯一的值对数组进行排序:

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

或者,您可以通过展开数组,然后排序,然后将日期放回到它们的小单元素数组中来避免定义自己的比较函数:

obj . data . 
    map(function(subarray) { return subarray[0]; }) .
    sort() .
    map(function(date) { return [date]; });