我能夠在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