想用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]
以上是個人測試的結果,如有不對還請指教。
