Javascript排序功能在Safari / iPhone中无效

时间:2013-06-03 08:17:05

标签: javascript iphone sorting safari

我查看了之前有关此主题的大部分问题,但仍无法让我的工作。

我有这个代码,它对一组对象进行排序:

array.sort(function(a,b){
  var dateA=new Date(a.created_time), dateB=new Date(b.created_time)
  return (dateB > dateA) ? 1 : (dateB < dateA) ? -1 : 0;
});

它在FF和Chrome(桌面)中运行良好,但在Safari(桌面/ iphone)和Chrome(iphone)中失败

对象数组是来自Facebook的AJAX调用,获取换行符,我想按created_time排序。

提前致谢...

2 个答案:

答案 0 :(得分:1)

问题是Safari和其他提到的浏览器(iphone上的chrome)无法解析传递给构造函数的输入String。这导致Invalid Date哪个基元值为NaN

因此,排序功能无法按比例运作,比较return (NaN > NaN) ? 1 : (NaN < NaN) ? -1 : 0;,导致return 0

要解决这个问题,只需要进行最少的解析工作,我就想要分割字符串 按-|:|T|\+。并使用日期部分来构建new Date

注意:不幸的是,像var d = Date.apply([year,month,...])是不可能的

所以这是一个在Safari上适用于我的排序功能

var dates = [{
        name: "A",
        created_time: '2013-06-05T08:05:06+0000'
    }, {
        name: "B",
        created_time: '2013-06-03T10:05:06+0000'
    }, {
        name: "C",
        created_time: '2013-06-03T01:05:06+0000'
    }
];

var sorted = dates.sort(function (a, b) {
        var reg = /-|:|T|\+/; //The regex on which matches the string should be split (any used delimiter) -> could also be written like /[.:T\+]/
        var parsed = [ //an array which holds the date parts for a and b
            a.created_time.split(reg), //Split the datestring by the regex to get an array like [Year,Month,Day,Hour,...]
            b.created_time.split(reg)
        ];
        var dates = [ //Create an array of dates for a and b
            new Date(parsed[0][0], parsed[0][1], parsed[0][2], parsed[0][3], parsed[0][4], parsed[0][5]),//Constructs an date of the above parsed parts (Year,Month...
            new Date(parsed[1][0], parsed[1][1], parsed[1][2], parsed[1][3], parsed[1][4], parsed[1][5])
        ];
        return dates[0] - dates[1]; //Returns the difference between the date (if b > a then a - b < 0)
    });

给出了输出:

console.log(sorted);
/*
[{
        "created_time": "2013-06-03T01:05:06+0000",
        "name": "C"
    }, {
        "created_time": "2013-06-03T10:05:06+0000",
        "name": "B"
    }, {
        "created_time": "2013-06-05T08:05:06+0000",
        "name": "A"
    }
]
*/

演示JSBin

答案 1 :(得分:0)

我知道这真的很老了,但我遇到了同样的问题并且有不同的解决方案。

如果您愿意/能够将moment.js添加到您的项目中,这些内容非常简单。 Moment处理不同浏览器引发的各种日期怪异......这在我迄今为止测试的每个浏览器中都有效。

array.sort( function( a, b ) {
            a = new moment(a.created_time);
            b = new moment(b.created_time);
            return a < b ? -1 : 1; // ascending order
        });