Safari不能像其他浏览器一样对对象数组进行排序

14
var myArray = [{date:"2013.03.01"},{date:"2013.03.08"},{date:"2013.03.19"}];

我试过:

function(a,b){
  return b.date > a.date;
}

function(a,b){
  return b.date - a.date;
}

Chrome和Firefox中,console.log为我提供了所需的输出:

"2013.03.19", "2013.03.08", "2013.03.01"

但是 Safari 给出了原始的排序:

"2013.03.01", "2013.03.08", "2013.03.19"

为什么?


1
你的对象实际值是什么?字符串?日期对象?你发布的代码无效。 - bfavaretto
那是什么?2013.03.01看起来不像JavaScript。 - Blindy
1
这似乎是描述在这里的问题:为什么Safari 5无法对对象数组进行排序? 如果不是,您可能需要发布一个有效的jsfiddle,因为您现有的代码太不完整了,无法测试。 - BrianH
2个回答

30

在JavaScript中,排序函数应该返回一个实数--而不是true、false、字符串或日期。这个数字是正数、负数还是零会影响排序结果。

试试这个排序函数(它也可以正确地将任何字符串按照反字母顺序排序):

myArray.sort(function(a,b){
  return (b.date > a.date) ? 1 : (b.date < a.date) ? -1 : 0;
});

非常感谢,我在这方面做了更多的研究,最终你的答案在Safari浏览器中适用 :) - Pratik

1
""2013.03.01"不是一个日期,而是一个字符串。

为了正确地按日期排序,您需要将其转换为日期(时间戳)。

"
var myArray = [{date:"2013.03.01"},{date:"2013.03.08"},{date:"2013.03.19"}];

myArray.sort(function(a,b){
    return Date.parse(b.date) - Date.parse(a.date);
});

您也可以使用直接字符串比较来对它们进行排序:

myArray.sort(function(a,b){
    return b.date.localeCompare(a.date);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接