摘要:發現的問題是字符串比較引起的。而在第二版的返回值是與,對應的是和。字符串比較是一個一個字符進行比較中方法的比較函數返回值正值,負值,的含義
前言
前幾天使用JavaScript中Array的sort排序字符串,發現排序不準確,這里記一下。
第一版var arr = ["0", "1", "11", "11", "2", "12", "123", "123", "333", "5"]; // 第一個版本 arr.sort(function(a, b) { return a > b; }) console.log(arr); // ["0", "1", "11", "11", "12", "123", "123", "2", "333", "5"] // 這里發現結果不對,預想的結果是 ["0", "1", "2", "5", "11", "11", "12", "123", "123", "333"]
那就找原因。發現的問題是字符串比較引起的。
在JavaScript中,字符串的比較,是字符按從左到右一一對應比較的。如果兩個字符串第一個字符是一樣,就比較第二個字符,如果第二個相等,就比較第三個,以此類推,直到比較出結果。
而單個字符間比較的規則,這是是比較他們的charCode的大小。
列如:
"a".charCodeAt(0) // 97 "b".charCodeAt(0) // 98 "a" > "b" // false第二版
明白了字符串比較的規則后, 就修改為下面的版本。
var arr = ["0", "1", "11", "11", "2", "12", "123", "123", "333", "5", "100"]; // 第二個版本 var isNumber = function(str) { // 前面說了是字符串類型,所以這里沒有做類型判斷 return !isNaN(str); } // isNaN 這個方法需要注意, 會隱式的進行類型轉, 需要注意 // isNaN(null) => false, isNaN(true) => false, isNaN([]) => false arr.sort(function(a, b) { // 如果比較雙方都是number類型的字符,按照number進行比較 if(isNumber(a) && isNumber(b)) { // 隱式轉換 return a - b; } return a > b; })第三版
字符里面全都是數字是沒有問題了,但是還需要考慮非純數字的情況
var arr = ["0", "1", "11", "11", "2", "12", "123", "123", "333", "5", "aa", "1aa"]; // 從小到大 var isNumber = function(str) { // 前面說了是字符串類型,所以這里沒有做類型判斷 return !isNaN(str); } arr.sort(function(a, b) { // 如果比較雙方都是number類型的字符,按照number進行比較 if(isNumber(a) && isNumber(b)) { // 隱式轉換 return a - b; } return a > b; }) // 輸出結果 ["0", "1", "2", "5", "11", "11", "12", "123", "123", "1aa", "333", "aa"] 這個沒有問題的 // 從大到小 var arr = ["0", "1", "11", "11", "2", "12", "123", "123", "333", "5", "aa", "1aa"]; var isNumber = function(str) { // 前面說了是字符串類型,所以這里沒有做類型判斷 return !isNaN(str); } arr.sort(function(a, b) { // 如果比較雙方都是number類型的字符,按照number進行比較 if(isNumber(a) && isNumber(b)) { // 隱式轉換 return b - a; } return b > a; }) // 輸出結果 ["123", "1aa", "aa", "5", "2", "333", "123", "12", "11", "11", "1", "0"] 已經是不符合期望
于是查找原因,發現原因是sort的比較方法的返回值不對。
如果想按照其他標準進行排序,就需要提供比較函數,該函數要比較兩個值,然后返回一個用于說明這兩個值的相對順序的數字。比較函數應該具有兩個參數 a 和 b,其返回值如下:
若 a 小于 b,在排序后的數組中 a 應該出現在 b 之前,則返回一個小于 0 的值。
若 a 等于 b,則返回 0。
若 a 大于 b,則返回一個大于 0 的值。
而在第二版的返回值是true與false,對應的是 1 和 0。于是修改為下面的版本
var arr = ["0", "1", "11", "11", "2", "12", "123", "123", "333", "5", "aa", "1aa"]; // 從大到小 var isNumber = function(str) { // 前面說了是字符串類型,所以這里沒有做類型判斷 return !isNaN(str); } arr.sort(function(a, b) { // 如果比較雙方都是number類型的字符,按照number進行比較 if(isNumber(a) && isNumber(b)) { // 隱式轉換 return b - a; } return b === a ? 0 : b > a ? 1 : -1; }) // 輸出結果["aa", "333", "1aa", "123", "123", "12", "11", "11", "5", "2", "1", "0"]總結
在JS中字符串比較和sort進行排序不經常使用,使用的時候多測測。就能越過一些不必要的坑。
字符串比較是一個一個字符進行比較 Array中sort方法的比較函數返回值正值,負值,0的含義文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107653.html
摘要:事件的響應分區為三個階段捕獲目標冒泡階段。綁定的多個事件會被覆蓋,后者覆蓋前者。再用轉換成數值表示。如實際數量為,則展示為項目中使用過濾器做的處理可以抽取方法的,調整相關,可以獲取指定位數的縮寫。 CSS html5中a的download屬性 定義和用法download 屬性定義下載鏈接的地址或指定下載文件的名稱。文件名稱沒有限定值,瀏覽器會自動在文件名稱末尾添加該下載文件的后綴 (...
摘要:希爾排序希爾排序這個名字,來源于它的發明者希爾,也稱作縮小增量排序,是插入排序的一種更高效的改進版本。我們可以發現,當區間為的時候,它使用的排序方式就是插入排序。 冒泡排序 冒泡排序無疑是最為出名的排序算法之一,從序列的一端開始往另一端冒泡(你可以從左往右冒泡,也可以從右往左冒泡,看心情),依次比較相鄰的兩個數的大小(到底是比大還是比小也看你心情)。 showImg(https://s...
摘要:我們討論比較排序算法的理論基礎,并結合本章應用排序和優先級隊列算法?;九判蛞肓诉x擇排序,插入排序和。描述了,一種保證在線性時間內運行的排序算法。當我們后續實現排序算法時,我們實際上將這個機制隱藏在我們的實現下面。 前言 上一篇:棧和隊列下一篇:歸并排序 排序是重新排列一系列對象以便按照某種邏輯順序排列的過程。排序在商業數據處理和現代科學計算中起著重要作用。在交易處理,組合優化,天體...
閱讀 1215·2021-11-22 12:05
閱讀 1342·2021-09-29 09:35
閱讀 639·2019-08-30 15:55
閱讀 3128·2019-08-30 14:12
閱讀 958·2019-08-30 14:11
閱讀 2881·2019-08-30 13:10
閱讀 2403·2019-08-29 16:33
閱讀 3332·2019-08-29 11:02