1. 程式人生 > 實用技巧 >javascript中sort方法的完整解析--排序

javascript中sort方法的完整解析--排序

說起對陣列的排序,大家能想到的應該是氣泡排序,快速排序,sort排序,以及希爾排序吧,但是可能對sort排序只停留再陣列層面(每個元素均是數字或者字串),事實上,它還可以對物件進行排序。

原理是:不管元素是什麼型別,sort排序始終是根據元素的unicode編碼進行的

下面來分別看下各種情況:

元素為數字或者字串:

var arr1 = [10,1,5,2,3];

arr1.sort();

console.log(arr1);

大家可以看下它的結果:

很明顯是根據unicode編碼來排序的,這也顯示了其不穩定性。

[語法]:
arr.sort()

arr.sort(compareFunction
)
[引數]:
compareFunction可選。用來指定按某種順序進行排列的函式。如果省略,元素按照轉換為的字串的諸個字元的Unicode位點進行排序。
[返回值]:
返回排序後的陣列。原陣列已經被排序後的陣列代替。
[描述]:

如果沒有指明compareFunction,那麼元素會按照轉換為的字串的諸個字元的Unicode位點進行排序。例如 "Banana" 會被排列到 "cherry" 之前。數字比大小時,2 出現在 10 之前,但這裡比較時數字會先被轉換為字串,所以"10" 比 "2" 要靠前。

如果指明瞭compareFunction,那麼陣列會按照呼叫該函式的返回值排序。即a 和 b 是兩個將要被比較的元素:

  • 如果compareFunction(a, b)小於 0 ,那麼 a 會被排列到 b 之前;
  • 如果compareFunction(a, b)等於 0 , a 和 b 的相對位置不變。備註: ECMAScript標準並不保證這一行為,而且也不是所有瀏覽器都會遵守(例如 Mozilla 在 2003 年之前的版本);
  • 如果compareFunction(a, b)大於 0 , b 會被排列到 a 之前。
  • compareFunction(a, b)必須總是對相同的輸入返回相同的比較結果,否則排序的結果將是不確定的。
那麼我們就可以運用以上所說的compareFunction去完成對數字的排序:
  1. var arr1 = [10,1,5,2,3]; function compare(a,b){ if (a < b) { return -1; } if (a > b) { return 1; } // a must be equal to b return 0; } arr1.sort(compare); console.log(arr1);
當然也可以簡化為:
  1. var arr1 = [10,1,5,2,3]; arr1.sort(function(a, b) { return a - b; }); console.log(arr1);
其結果是不變的:
元素為物件時(可按其中某個屬性來排序):

var items = [

{ name: 'Edward', age: 21 },

{ name: 'Sharpe', age: 37 },

{ name: 'And', age: 45 },

{ name: 'The', age: -12 },

{ name: 'Magnetic',age:0 },

{ name: 'Zeros', age: 37 }

];

items.sort(function (a, b) {

if (a.age > b.age) {

return 1;

}

if (a.age< b.age) {

return -1;

}

// a 必須等於 b

return 0;

});

則items為:

var arr1 = [10,1,5,2,3];arr1.sort();console.log(arr1);