国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

記數組sort方法與字符串比較引起的Bug

wendux / 2519人閱讀

摘要:發現的問題是字符串比較引起的。而在第二版的返回值是與,對應的是和。字符串比較是一個一個字符進行比較中方法的比較函數返回值正值,負值,的含義

前言

前幾天使用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 屬性定義下載鏈接的地址或指定下載文件的名稱。文件名稱沒有限定值,瀏覽器會自動在文件名稱末尾添加該下載文件的后綴 (...

    Gu_Yan 評論0 收藏0
  • 前端實用資源整理

    摘要:事件的響應分區為三個階段捕獲目標冒泡階段。綁定的多個事件會被覆蓋,后者覆蓋前者。再用轉換成數值表示。如實際數量為,則展示為項目中使用過濾器做的處理可以抽取方法的,調整相關,可以獲取指定位數的縮寫。 CSS html5中a的download屬性 定義和用法download 屬性定義下載鏈接的地址或指定下載文件的名稱。文件名稱沒有限定值,瀏覽器會自動在文件名稱末尾添加該下載文件的后綴 (...

    wslongchen 評論0 收藏0
  • 這或許是東半球講十大排序算法最好一篇文章

    摘要:希爾排序希爾排序這個名字,來源于它的發明者希爾,也稱作縮小增量排序,是插入排序的一種更高效的改進版本。我們可以發現,當區間為的時候,它使用的排序方式就是插入排序。 冒泡排序 冒泡排序無疑是最為出名的排序算法之一,從序列的一端開始往另一端冒泡(你可以從左往右冒泡,也可以從右往左冒泡,看心情),依次比較相鄰的兩個數的大小(到底是比大還是比小也看你心情)。 showImg(https://s...

    wind3110991 評論0 收藏0
  • 基本排序 - Algorithms, Part I, week 2 ELEMENTARY SORTS

    摘要:我們討論比較排序算法的理論基礎,并結合本章應用排序和優先級隊列算法?;九判蛞肓诉x擇排序,插入排序和。描述了,一種保證在線性時間內運行的排序算法。當我們后續實現排序算法時,我們實際上將這個機制隱藏在我們的實現下面。 前言 上一篇:棧和隊列下一篇:歸并排序 排序是重新排列一系列對象以便按照某種邏輯順序排列的過程。排序在商業數據處理和現代科學計算中起著重要作用。在交易處理,組合優化,天體...

    BLUE 評論0 收藏0

發表評論

0條評論

wendux

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<