2014-07-18 85 views
1

我有對象的數組名,就像這樣:與布爾值排序對象

myArray = [ 
      {name : 'foo'}, 
      {name : 'bar'}, 
      {name : 'Foo'} 
      ] 

我要排序這些字母數字對象的名字,並使用以下排序函數來進行:

myArray.sort(function(a,b){ 
    return a.name > b.name; 
}); 

這似乎是工作,但我無法找到在規範與問候什麼sort應該如何當比較函數返回布爾值的功能。這似乎沒有遵循如下要求:如果a > b返回大於零的值,則a < b返回小於零的值,並且a === b返回等於零的值。

我想知道的是,將使用一個函數返回一個布爾工作一致的跨瀏覽器排序?

+0

一個聰明的方法來做到這一點:http://stackoverflow.com/questions/17387435/javascript-sort-array-of-objects-by-a-boolean-property –

+0

我不能提供所有瀏覽器的證據,但我的假設是,它將任何值作爲數字轉換並將其捨棄('true | 0 == 1'),所以它很可能跨瀏覽器。 –

回答

2

基本上功能總是返回01,但從來沒有-1。即如果將barfoo'bar' > 'foo')進行比較,則認爲它們相等。

它可能無法在整個瀏覽器中一致地工作,因爲實際的排序算法是與實現有關的。由於你的函數永遠不會返回-1,實際結果可能取決於元素的初始順序。

所以即使它看起來就像它工作正常,有些情況下它不會。你不能用布爾(真,假)表示三種狀態(小,平等,大)。

+1

在1000個字符串的數組上運行這個函數後,我最終使用了'myArray.sort(function(a,b){return a.localeCompare(b)}'(在Chrome中進行測試) – ckersch

0

它可能適用於所有瀏覽器(你將不得不自己測試它們),但如果你不遵循規範,我不會依賴這種行爲。儘管如此,因爲true == 1false == 0,人們可能會認爲瀏覽器的實現不是嚴格檢查返回值的類型,而只是在比較中使用它。

你可能還沒有意識到的另一件事是,排序可能不會做你的想法。你的比較函數實質上是說,即使這兩個名字都是相同的。這是潛在的危險部分,因爲不同的排序算法可能會以不同的方式使用比較器的結果,並且取決於瀏覽器使用的底層排序功能,數組中元素的初始順序,有時甚至是大小和列表中的元素類型(你會感到驚訝),你可能會得到意想不到的結果。

只要return a.name ? a.name.localeCompare(b.name) : -1;,如果你真的想要一個班輪。