js的Array的sort()排序方法


Arraysort()方法默認把所有元素先轉換為String再排序,字符串是根據ASCII碼進行排序,所以sort()方法排序結果畫風可能是這樣的

// 看上去正常的結果:
['Google', 'Apple', 'Microsoft'].sort(); // ['Apple', 'Google', 'Microsoft'];

// apple排在了最后:
['Google', 'apple', 'Microsoft'].sort(); // ['Google', 'Microsoft", 'apple']

// 無法理解的結果:
[10, 20, 1, 2].sort(); // [1, 10, 2, 20]

第二個排序把apple排在了最后,是因為字符串根據ASCII碼進行排序,而小寫字母a的ASCII碼在大寫字母之后。

第三個排序是因為sort()方法默認把所有元素先轉換為String再排序,結果'10'排在了'2'的前面,而字符'1'比字符'2'的ASCII碼小。

 

幸運的是,sort()方法也是一個高階函數,它還可以接收一個比較函數來實現自定義的排序。

要按數字大小排序,我們可以這么寫:

 

sort() 方法用於對數組的元素進行排序,並返回數組。默認排序順序是根據字符串Unicode碼點。
語法:arrayObject.sort(sortby);參數sortby可選。規定排序順序。必須是函數。
注:如果調用該方法時沒有使用參數,將按字母順序對數組中的元素進行排序,說得更精確點,是按照字符編碼的順序進行排序。要實現這一點,首先應把數組的元素都轉換成字符串(如有必要),以便進行比較。

如果想按照其他標准進行排序,就需要提供比較函數,該函數要比較兩個值,然后返回一個用於說明這兩個值的相對順序的數字。比較函數應該具有兩個參數 a 和 b,其返回值如下:
若 a 小於 b,在排序后的數組中 a 應該出現在 b 之前,則返回一個小於 0 的值。
若 a 等於 b,則返回 0。
若 a 大於 b,則返回一個大於 0 的值。

 

var arr = [10, 20, 1, 2];
arr.sort(function (x, y) {
    if (x < y) {
        return -1;
    }
    if (x > y) {
        return 1;
    }
    return 0;
});
//
arr.sort(function(a,b){
return a-b;//升序
return b-a;//降序
}) console.log(arr);
// [1, 2, 10, 20]

 

最后友情提示,sort()方法會直接對Array進行修改,它返回的結果仍是當前Array

var a1 = ['B', 'A', 'C'];
var a2 = a1.sort();
a1; // ['A', 'B', 'C']
a2; // ['A', 'B', 'C']
a1 === a2; // true, a1和a2是同一對象

 

例如:學生根據年齡大小進行排序

var list=[
      {
         name:"hq",
         age:24
      },
      {
          name:"gq",
          age:21
      },
      {
          name:"xm",
          age:25
      }
    ]
    function compare(property){
        return function(a,b){
            var val1=a[property];
            var val2=b[property];
            return val1-val2;
        }
    }
    console.log(list.sort(compare("age")))
    console.log(list.sort(function(a,b){
          var val1=a["age"];
          var val2=b["age"];
          return val1-val2;
    }));
    console.log(list);

 

來源:https://www.cnblogs.com/yourself/p/8709459.html

參考:https://www.cnblogs.com/moqiutao/p/6382097.html

 


免責聲明!

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



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