我能够在JavaScript中正确比较版本号,而不必拆分和检查每个十进制数。它是如何工作的?版本号比较如何在JavaScript中正确工作?
("2.0.1" > "2.1.0")
false
("2.2.1" > "2.1.0")
true
("2.5.1" > "2.0.5")
true
谢谢。
我能够在JavaScript中正确比较版本号,而不必拆分和检查每个十进制数。它是如何工作的?版本号比较如何在JavaScript中正确工作?
("2.0.1" > "2.1.0")
false
("2.2.1" > "2.1.0")
true
("2.5.1" > "2.0.5")
true
谢谢。
不,你不“能够无需分割比较正确的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
因为你字典顺序比较字符串,它产生在你的例子同样的结果。但是,这在任何情况下都不起作用,例如当您进入两位数字时:2.15.29
。
更好的比较方法是创建一个版本号浮筒,然后子版本号,这样转换后如下图所示
subVersion = parseInt(fullVersion.split(".")[2]);
mainVersion = parseFloat(fullOsVer);
,你可以做对比。这个比较将比较两个整数。
更简洁,更简洁的解决方案。
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
['semver'(https://github.com/npm/node-semver) – thefourtheye
它实际上做一个字符一个字符的字符串比较。 – Matt
请小心,例如:“2.10”<“2.2” – CoderPi