APP版本號對比大小及排序

在最近的一次開發過程中,遇到了一個需求,需要獲取所有同類型中最新的版本號,後端沒有這個接口,只能獲取全部版本號數據在前端處理。一開始就想到了使用數組的sort()方法去處理,但是因爲版本號的命名不規律等問題,自己寫的始終有問題,後來也是網上看了大神們的代碼,才進行了補完。現在整理整理,以備後用。

一、對比版本號大小

方法一: 轉成數字進行對比(適用於兩個比較有規律命名的版本號,且版本號爲數字,不包含字母及特殊符號)

function compare(a, b) {

    // 得到去除'.'後的字符串
    var aa = a.split('.').join('');    // 也可以使用replace的方法  repalce(/\./g, '')
    var bb = b.split('.').join('');
    console.log(aa, bb);   // '1055' '121'  

    // 獲取兩個新字符串的最大長度
    var maxl = Math.max(aa.length, bb.length);
    console.log(maxl);     // 4

    // 使用'0'補齊字符串長度
    // 這裏要注意,使用number類型進行比較; 使用string類型進行比較,是通過ASCII碼比較,不準確
    // 如果是數字字符串與純數字比較,會隱式轉成純數字後進行比較,則不存在該問題
    var aaa = parInt(aa + ((maxl - aa.length) > 0 ? (maxl - aa.length)*0 : ''));
    var bbb = parInt(bb + ((maxl - bb.length) > 0 ? (maxl - bb.length)*0 : ''));
    console.log(aaa,bbb);  // 1055 1210

    // 比較版本大小
    if (aaa === bbb) {
        return '兩者相等';
    } else {
        return aaa > bbb ? a : b;
    }
};

// 定義兩個版本號變量
var a = '1.0.55';
var b = '1.2.1';
compare(a, b);   // b


方法二: (待續。。。)

 

二、對版本號數組進行排序

function compareArr(arr) {

    // 利用Array的 sort()方法進行比較排序
    arr.sort(function (a,b) {
        var aa = a.split('.')
        var bb = b.split('.')
        var maxL = Math.max(aa.length, bb.length);
        
        // 補齊數組, 統一length
        var aaa = aa.concat(new Array(maxL - aa.length).fill('0'))
        var bbb = bb.concat(new Array(maxL - bb.length).fill('0'))
        
        // 進行數值大小比較
        var r = null
        for (let i = 0; i < maxL; i++) {
            if (parseInt(aaa[i]) < parseInt(bbb[i])) {
                 r = 1
                 break
            } else if (parseInt(aaa[i]) > parseInt(bbb[i])) {
                 r = -1
                 break
            } else if (i === maxL && aaa[i] === bbb[i]) {
                 r = 0
            }
        }
        return r
   })

}

var versionArr = [ '1.0.1', '1.05.1', '1.2.5555', '1.1.3.2', '1', '1.10']
console.log(compareArr(versionArr))    // ["1.10", "1.05.1", "1.2.5555", "1.1.3.2", "1.0.1", "1"]

注:以上方法,參考了網上的一些寫法,並進行了修改完善。

統一數組長度,使用最大長度進行循環比較,而不是使用最小長度進行比較,避免了版本號風格不統一的問題。

使用了數字比較而不是字符串比較,避免不準確的bug。

不足: 沒有總結版本號中包含字母或者特殊符號等的比較;只適用於版本號爲數字標記的。

 

發佈了10 篇原創文章 · 獲贊 9 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章