2016-01-15 59 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