JS數組Sort方法的使用


想用sort方法對數組排下序,代碼如下:

1 var nums = "12 645 6 85 81 0 9 365 4 752".split(" ").map(function(a){
2  return Number(a);
3 });
4 console.log(nums); // 排序前 [12, 645, 6, 85, 81, 0, 9, 365, 4, 752]
5 console.log(nums.sort()); // 排序后 [0, 12, 365, 4, 6, 645, 752, 81, 85, 9]

排序后的結果並不是預期的按照數值大小排列的,帶着疑問去查了一下《JavaScript權威指南》,發現:

當不帶參數調用sort()時,數組元素以字母表順序排序(如有必要將臨時轉化為字符串進行比較)

原來默認都是以字符串形式比較的,接着又試驗了兩把:

 1 var words = "Lorem ipsum dolor sit amet consectetur adipisicing elit.".split(" ");
 2 console.log(words); //["Lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipisicing", "elit."]
 3 //只有字符串的情況
 4 console.log(words.sort()); //["Lorem", "adipisicing", "amet", "consectetur", "dolor", "elit.", "ipsum", "sit"]
 5 //數字和字符串的情況
 6 var numAndWords = ["Lorem", "ipsum", "dolor", "sit", "amet", 12, 645, 6, 85, 81, 0];
 7 console.log(numAndWords.sort()); //[0, 12, 6, 645, 81, 85, "Lorem", "amet", "dolor", "ipsum", "sit"]
 8 //數字和部分以數字開頭的字符串
 9 numAndWords = ["Lorem", "2ipsum", "13dolor", "sit", "amet", 12, 645, 6, 85, 81, 0];
10 console.log(numAndWords.sort()); //[0, 12, "13dolor", "2ipsum", 6, 645, 81, 85, "Lorem", "amet", "sit"]

結果都符合預期,是按照ACSII碼順序進行比較的。如果想按照數值大小進行排序,該如何操作呢?這就用到了帶參數的sort方法,參數可以是function,這樣就能夠按照自定義的方式排序了。

下面定義一個按照數值大小排序的方法:

 1 nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
 2 console.log(nums.sort(function(a, b){
 3   if(a < b){
 4     return -1;
 5   }
 6   else if (a > b) {
 7     return 1;
 8   }
 9   else{
10     return 0;
11   }
12 })); //結果為:[0, 4, 6, 9, 12, 81, 85, 365, 645, 752]

根據《JavaScript權威指南》的說法:

給sort方法傳遞一個比較函數,該函數決定了它的兩個參數在排好序的數組中的先后順序:假設第一個參數應該在前,比較函數應該返回一個小於0的數值,反之,假設第一個參數應該在后,函數應該返回一個大於0的數值,並且,假設兩個值相等,函數應該返回0。

但是如下比較函數返回大於0的數值時的測試有些意外:

 1 nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
 2 console.log(nums.sort(function (a, b) {
 3   if (a < b) {
 4     return 1;
 5   }
 6 })); //結果為:[12, 645, 6, 85, 81, 0, 9, 365, 4, 752]
 7 nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
 8 console.log(nums.sort(function (a, b) {
 9   if (a > b) {
10     return 1;
11   }
12 })); //結果為:[12, 645, 6, 85, 81, 0, 9, 365, 4, 752]

接着繼續測試比較函數返回小於0的數值時的情況:

 1 nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
 2 console.log(nums.sort(function (a, b) {
 3   if (a < b) {
 4     return -1;
 5   }
 6 })); //結果為:[0, 4, 6, 9, 12, 81, 85, 365, 645, 752]
 7 nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
 8 console.log(nums.sort(function (a, b) {
 9   if (a > b) {
10     return -1;
11   }
12 })); //結果為:[752, 645, 365, 85, 81, 12, 9, 6, 4, 0]

只有比較函數返回值小於0時才會進行數組的排序。

《JavaScript權威指南》給出了一種簡便的按照數值大小比較的方法:

1 nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
2 console.log(nums.sort(function(a, b){
3   return a - b;
4 })); //結果為:[0, 4, 6, 9, 12, 81, 85, 365, 645, 752]

以上是個人測試的結果,如有不對還請指教。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM