afc*_*ign 5 javascript sorting iphone 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;
});
Run Code Online (Sandbox Code Playgroud)
它在FF和Chrome(台式机)中工作正常,但在Safari(台式机/ iphone)和Chrome(iphone)中失败
对象数组是来自Facebook的AJAX调用,获取了墙上的提要,我想按created_time进行排序。
提前致谢...
问题是 Safari 和其他提到的浏览器(iPhone 上的 chrome)无法解析您传递给构造函数的输入字符串。哪个结果是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)
});
Run Code Online (Sandbox Code Playgroud)
给出输出:
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"
}
]
*/
Run Code Online (Sandbox Code Playgroud)
JSBin上的演示