2013-03-19 106 views
11
var myArray = [{date:"2013.03.01"},{date:"2013.03.08"},{date:"2013.03.19"}]; 

我想:Safari不排序的對象數組像其他瀏覽器

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-19 18:36:49

+0

* *表示什麼? '2013.03.01'看起來不像JavaScript。 – Blindy 2013-03-19 18:37:35

+1

這似乎是這裏所描述的問題:爲什麼不會Safari 5的排序對象數組?](http://stackoverflow.com/questions/4299062/why-wont-safari-5-sort-an-array- )如果不是,你可能需要發佈一個有效的jsfiddle,因爲你現有的代碼太不完整而無法測試。 – BrianHall 2013-03-19 18:40:47

回答

24

在JavaScript中的排序功能,應該返回一個實數 - 不是真或假或字符串或日期。這個數字是正數,負數還是零都會影響排序結果。

嘗試此排序功能(其也能正確排序在反向字母順序任何字符串):

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

您可能還可以使用直接串comparasions也對它們進行排序:

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