最近群了有人問如何比較版本號,我好奇的試了一下。
比較版本號,怎么辦?懶人的方法是借鑒,先查網上的資料,看看有木有直接的幫過來的。而且直接便捷的好像在茫茫"文海"中,而且發現大多數是Java的,於是這里自己試了下用js 來比較,並試圖找到簡潔的比較方法。
比較版本號就是對字符串進行比較,這里結合正則表達式處理版本號。
首先,來比較常見的版本號 如 "2.2.3","2.3.0":
js版本號比較--之版本1.0(ps:由於后面進行改進,因此對每次比較加個"版本號" )
//假定字符串的每節數都在5位以下
function toNum(a){ var a=a.toString(); //也可以這樣寫 var c=a.split(/\./); var c=a.split('.'); var num_place=["","0","00","000","0000"],r=num_place.reverse(); for (var i=0;i<c.length;i++){ var len=c[i].length; c[i]=r[len]+c[i]; } var res= c.join(''); return res; } function cpr_version(a,b){ var _a=toNum(a),_b=toNum(b); if(_a==_b) console.log("版本號相同!版本號為:"+a); if(_a>_b) console.log("版本號"+a+"是新版本!"); if(_a<_b) console.log("版本號"+b+"是新版本!"); } var a="2.2.3";b="2.3.0"; cpr_version(a,b);
在chrome 控制台中執行結果:

多來幾組:

有的版本號可能帶有字母,如何比較呢?如 "v2.2.3","v2.3.0", 不用着急,用正則表達式,改動一點點即可:
js版本號比較--之版本1.1
//假定字符串的每節數都在5位以下
function toNum(a){ var a=a.toString(); //這里變了 var c=a.split(/\D/); var num_place=["","0","00","000","0000"],r=num_place.reverse(); for (var i=0;i<c.length;i++){ var len=c[i].length; c[i]=r[len]+c[i]; } var res= c.join(''); return res; } function cpr_version(a,b){ var _a=toNum(a),_b=toNum(b); if(_a==_b) console.log("版本號相同!版本號為:"+a); if(_a>_b) console.log("版本號"+a+"是新版本!"); if(_a<_b) console.log("版本號"+b+"是新版本!"); } var a="v2.2.3";b="v2.3.0"; cpr_version(a,b); var a="v2.21";b="v2.3.10"; cpr_version(a,b); var a="v3.1.25";b="v3.1.25"; cpr_version(a,b);
執行結果:

到這里,js比較版本號基本結束。在網上看到居然有類似這種"2.3.0a","2.3.0b"版本號,顯然后一種版本新一些。如果有,該如何比較呢?
思路不變,上面已經處里好了數字的,接下來只需比較字母的順序:
js版本號比較之--版本1.2
//假定字符串的每節數都在5位以下 //去除數組空值||空格值 if (!Array.prototype.trim){ Array.prototype.trim=function(){ var arr=[]; this.forEach(function(e){ if(e.match(/\S+/)) arr.push(e); }) return arr; } } //提取數字部分 function toNum(a){ var a=a.toString(); var c=a.split(/\D/).trim(); var num_place=["","0","00","000","0000"],r=num_place.reverse(); for (var i=0;i<c.length;i++){ var len=c[i].length; c[i]=r[len]+c[i]; } var res= c.join(''); return res; } //提取字符 function toChar(a){ var a=a.toString(); var c=a.split(/\.|\d/).join(''); return c; } function cpr_version(a,b){ var _a1=toNum(a),_a2= toChar(a), _b1=toNum(b),_b2= toChar(b); if(_a1>_b1) console.log("版本號"+a+"是新版本!"); if(_a1<_b1) console.log("版本號"+b+"是新版本!"); if(_a1===_b1) { _a2=_a2.charCodeAt(0).toString(16); _b2=_b2.charCodeAt(0).toString(16); if (_a2>_b2) console.log("版本號"+a+"是新版本!"); if(_a2<_b2) console.log("版本號"+b+"是新版本!"); if(_a2===_b2) console.log("版本號相同!版本號為:"+a); } } var a="2.3.0a",b="2.3.0b"; cpr_version(a,b); var a="2.3.0c",b="2.3.0c"; cpr_version(a,b);
在chrome 控制台中執行結果:

至此,帶字符升級模式的版本號也比較完了。當然,上面的腳本只能比較帶一個字母字符的,帶多個字母字符的"版本號"不常見,在此略去。上面也只是比較
了一對,如果有多組版本號,改如何處理呢?請看筆者文章:js比較版本號(二)
