在最近的一次開發過程中,遇到了一個需求,需要獲取所有同類型中最新的版本號,後端沒有這個接口,只能獲取全部版本號數據在前端處理。一開始就想到了使用數組的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。
不足: 沒有總結版本號中包含字母或者特殊符號等的比較;只適用於版本號爲數字標記的。