# sort ### Array.prototype.sort() * 根據MDN解釋 sort() 會原地(in place)對一個陣列的所有元素進行排序,且回傳給我們排好序的陣列。 * 預設的排序順序是根據字串的 Unicode 編碼位置(code points)而定。 ```javascript= let arr1 = [null, 2, 8, undefined, NaN, 200, "Hi", "apple", "", "#", "!", "2"]; arr1.sort(); console.log(arrr1); // [ '', '!', '#', '2', 2, 200, 8, 'Hi', NaN, 'apple', null, undefined ] ``` sort()會將所有元素轉成字串後,且以第一個字元為對象,再進行排序,而所有符號會被先篩選出來,接著是數字,然後是字母。也因為這樣的比較,所以連200都會排在8前面。而字母則以字母大寫為先、小寫為後來排序。 * 語法: arr.sort([compareFunction]) # 用匿名函式當排序條件 - 如果希望完全依照自己給的條件排序,最好是給sort()一個帶有條件的匿名函式來當參數,這個匿名函數必須要有兩個參數,然後再依照這兩個參數比較回傳的值,來當排序依據。 - sort()會依匿名函式的參數與回傳的值為精確的排序規則: 當回傳值為負數時,那麼前面的數放在前面 當回傳值為正整數,那麼後面的數在前面 當回傳值為零,保持不動。 ### 寫法一 ```javascript= const arr = [5, 9, 1, 3, 2, 6]; // 升序 arr.sort(function(a, b) { if(a > b){ return 1; // 正數時,後面的數放在前面 } else { return -1 // 負數時,前面的數放在前面 } }); // 降序 arr.sort(function(a, b) { if(a < b){ return 1; // 正數時,後面的數放在前面 } else { return -1 // 負數時,前面的數放在前面 } }); ``` ### 寫法二(寫法一精簡版) ```javascript= const arr = [5, 9, 1, 3, 2, 6]; // 以匿名函式回參數做「升序」排序 arr.sort(function(a, b) { return a - b; // a - b > 0 }); // [1, 2, 3, 5, 6, 9] // 如果要反過來做「降序」排序 arr.sort(function(a, b) { return b - a; }); // [9, 6, 5, 3, 2, 1] ``` # 可以拿 sort 來做什麼? * 按照字串長度來排序 ```javascript= const arr = ["hi", "Hello", "Bonjour", "ciao"]; arr.sort(function(a,b) { return a.length - b.length; }); console.log(arr); // ["hi", "ciao", "Hello", "Bonjour"] ``` * 對字串做不區分大小寫的排序 sort()的預設會以 Unicode 來排序,而在 Unicode 的排序裡,大寫字母又會比小寫前面,但當我們要對有大小寫混雜的字串陣列做排序時,如何做到不區分大小寫的排序?可參考下列的方式,先把字串全轉成小寫再比對,就可以得到不分大小寫的排序 ```javascript= arr =["apple", "grape", "Ege", "coco", "Banana"]; // 直接預設排序的結果 arr.sort(); // ['Banana', 'Ege', 'apple', 'coco', 'grape'] arr.sort(function(x, y){ let a = x.toLowerCase(); let b = y.toLowerCase(); if(a>b){ return 1; }else { return -1; } }); // ['apple', 'Banana', 'coco', 'Ege', 'grape'] ```