Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript排序功能在Safari/iPhone中不起作用_Javascript_Iphone_Sorting_Safari - Fatal编程技术网

Javascript排序功能在Safari/iPhone中不起作用

Javascript排序功能在Safari/iPhone中不起作用,javascript,iphone,sorting,safari,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; }); array.sort(函数(a,b){ var dateA=新日

我已经浏览了之前关于这个主题的大部分问题,但仍然无法让我的问题发挥作用

我有一段代码,它对对象数组进行排序:

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;
});
array.sort(函数(a,b){
var dateA=新日期(a.创建时间),dateB=新日期(b.创建时间)
return(dateB>dateA)?1:(dateB
它在FF和Chrome(桌面)中工作正常,但在Safari(桌面/iphone)和Chrome(iphone)中失败

对象数组是来自Facebook的AJAX调用,得到一个墙提要,我想按创建时间排序


提前感谢…

问题是Safari和其他提到的浏览器(iphone上的chrome)无法解析传递给构造函数的输入字符串。这将导致
无效日期
哪个原语值是
NaN

因此,排序函数不能像inted那样工作,比较
return(NaN>NaN)?1:(楠<楠)-1 : 0;,导致
返回0

为了解决这个问题,我考虑只拆分字符串,只需进行最少的解析工作 通过
-:|T\+
。并单独使用日期部分来构造新日期

注:不幸的是,var d=Date.apply([年,月,…])之类的内容是不可能的

这是一个在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)
    });

演示

我知道这很旧,但我遇到了同样的问题,有了不同的解决方案

如果您愿意/能够将moment.js添加到您的项目中,那么这件事是完全简单的。“时刻”处理不同浏览器抛出的各种各样的约会怪事。。。到目前为止,我测试过的每一款浏览器都能做到这一点

array.sort(function(a, b) {
  a = new moment(a.created_time);
  b = new moment(b.created_time);
  return a < b ? -1 : 1; // ascending order
});
array.sort(函数(a,b){
a=新时刻(a.创建时间);
b=新时刻(b.创建时间);
返回a
在任何浏览器中都不起作用!?创建的时间是以毫秒为单位的时间吗,就像1370249076800一样?不,是这样的:'2013-06-03T08:05:06+0000'那么,这是因为浏览器的日期不同。iphone和safari上的mobile chrome似乎无法解析像
2013-06-03T08:05:06+0000这样的字符串。你需要自己解析字符串并创建一个新的日期。好吧,我自己不会想到这个,我仍在努力准确地掌握你在做什么。但它是有效的:)-非常感谢@afcdesign You's welcome=)我对代码进行了注释,使其更易于理解。如果你有任何问题,请发表评论。@C5H8NNaO4谢谢你,在找到这篇文章之前,我花了很多时间把头撞在桌子上。
array.sort(function(a, b) {
  a = new moment(a.created_time);
  b = new moment(b.created_time);
  return a < b ? -1 : 1; // ascending order
});