2016-01-15 58 views
2

我能夠在JavaScript中正確比較版本號,而不必拆分和檢查每個十進制數。它是如何工作的?版本號比較如何在JavaScript中正確工作?

("2.0.1" > "2.1.0") 
false 

("2.2.1" > "2.1.0") 
true 

("2.5.1" > "2.0.5") 
true 

謝謝。

+1

['semver'(https://github.com/npm/node-semver) – thefourtheye

+1

它實際上做一個字符一個字符的字符串比較。 – Matt

+0

請小心,例如:「2.10」<「2.2」 – CoderPi

回答

8

不,你不「能夠無需分割比較正確的JavaScript版本號」

"2.2.8" > "2.2.10" // true 

那些比較字符串的字符一個字符後,由左到右。

你確實需要分割和比較號碼後的數字,這很容易。這裏有一個例子,你如何可以實現它:

function Version(s){ 
    this.arr = s.split('.').map(Number); 
} 
Version.prototype.compareTo = function(v){ 
    for (var i=0; ;i++) { 
    if (i>=v.arr.length) return i>=this.arr.length ? 0 : 1; 
    if (i>=this.arr.length) return -1; 
    var diff = this.arr[i]-v.arr[i] 
    if (diff) return diff>0 ? 1 : -1; 
    } 
} 

console.log((new Version("1.1.1")).compareTo(new Version("1.2.1"))); // -1 

console.log((new Version("1.1.1")).compareTo(new Version("1.10.1"))); // -1 

console.log((new Version("1.10.1.2")).compareTo(new Version("1.10.1"))); // 1 

console.log((new Version("1.10.1.2")).compareTo(new Version("1.10.1.2"))); // 0 
4

因爲你字典順序比較字符串,它產生在你的例子同樣的結果。但是,這在任何情況下都不起作用,例如當您進入兩位數字時:2.15.29

0

更好的比較方法是創建一個版本號浮筒,然後子版本號,這樣轉換後如下圖所示

subVersion = parseInt(fullVersion.split(".")[2]); 
mainVersion = parseFloat(fullOsVer); 

,你可以做對比。這個比較將比較兩個整數。

0

更簡潔,更簡潔的解決方案。

function Version(s) { 
 
    this.arr = s.split('.').map(Number); 
 
} 
 

 
Version.prototype.compareTo = function (v) { 
 
    var i, r = 0, l = Math.max(this.arr.length, v.arr.length); 
 
    for (i = 0; !r && i < l; i++) { 
 
     r = (this.arr[i] || 0) - (v.arr[i] || 0); 
 
    } 
 
    if (r) { 
 
     return r > 0 ? 1 : -1 
 
    } 
 
    return r; 
 
} 
 

 
document.write((new Version("1.1.1")).compareTo(new Version("1.2.1")) + '<br>');  // -1 
 
document.write((new Version("1.1.1")).compareTo(new Version("1.10.1")) + '<br>');  // -1 
 
document.write((new Version("1.10.1.2")).compareTo(new Version("1.10.1")) + '<br>'); // 1 
 
document.write((new Version("1.10.1.2")).compareTo(new Version("1.10.1.2")) + '<br>'); // 0