Nasıl yazılım sürüm numarası js kullanarak karşılaştırmak için? (tek sayı)
Burada yazılım sürüm numarası:
"1.0", "1.0.1", "2.0", "2.0.0.1", "2.0.1"
Bu nasıl karşılaştırma yapabilirim?? Doğru sırada olduğunu varsayalım:
"1.0", "1.0.1", "2.0", "2.0.0.1", "2.0.1"
Fikir basittir...: İlk basamak, ikinci, üçüncü sonra...oku. Ancak sürüm numarası yüzer convert edemiyorum.... Ayrıca bu sürüm numarası gibi görür
"1.0.0.0", "1.0.1.0", "2.0.0.0", "2.0.0.1", "2.0.1.0"
ve bu daha net bir fikir arkasında ne olduğunu görmek için... Ama, bir bilgisayar programı haline dönüştürmek nasıl?? Herhangi biri hakkında herhangi bir fikir bu sıralama var mı? Teşekkür ederim.
CEVAP
Temel fikir için bu karşılaştırma olurdu Array.split
get diziler bölgelerinden giriş dizeleri ve sonra karşılaştırmak çiftleri bölümlerinden iki dizi; eğer parçalar eşit değil bildiğimiz versiyonu daha küçük.
Akılda tutulması gereken önemli birkaç detay vardır:
- Nasıl her çifti parçaları göre olmalıdır? Soru sayısal olarak karşılaştırmak istiyor, ama eğer sadece rakamlardan oluşuyor bu sürüm dizeleri varsa ne ("") 1.0? örneğin
- Eğer bir sürüm dizesi diğerinden daha fazla parça var ise ne yapmalıyım? "" Az daha düşünülmelidir "1.0.1", ama ne hakkında "1.0.0"? 1.0 büyük olasılıkla
Burada doğrudan kullanabileceğiniz bir uygulama (gist with documentation) için kod:
function versionCompare(v1, v2, options) {
var lexicographical = options && options.lexicographical,
zeroExtend = options && options.zeroExtend,
v1parts = v1.split('.'),
v2parts = v2.split('.');
function isValidPart(x) {
return (lexicographical ? /^\d [A-Za-z]*$/ : /^\d $/).test(x);
}
if (!v1parts.every(isValidPart) || !v2parts.every(isValidPart)) {
return NaN;
}
if (zeroExtend) {
while (v1parts.length < v2parts.length) v1parts.push("0");
while (v2parts.length < v1parts.length) v2parts.push("0");
}
if (!lexicographical) {
v1parts = v1parts.map(Number);
v2parts = v2parts.map(Number);
}
for (var i = 0; i < v1parts.length; i) {
if (v2parts.length == i) {
return 1;
}
if (v1parts[i] == v2parts[i]) {
continue;
}
else if (v1parts[i] > v2parts[i]) {
return 1;
}
else {
return -1;
}
}
if (v1parts.length != v2parts.length) {
return -1;
}
return 0;
}
Bu sürüm naturally karakter ekleri kabul etmez kısımlarını karşılaştırır ve değerlendirir "" daha küçük "1.7.0". 1.7 Mod dizeleri otomatik olarak olabilir kurb ve daha kısa versiyonu için değiştirilebilir karşılaştırma-yastıklı sıfır isteğe bağlı üçüncü bağımsız değişken kullanma.
JSFiddle çalışan "birim testleri" here; ripper234's work (teşekkür ederim) biraz genişletilmiş bir versiyonu..
ÖNEMLİ NOT:Bu kod Array.map
ve sürümleri IE 9'dan önceki çalışmayacak anlamına gelir Array.every
kullanır. Eğer bu destek gerekiyorsa eksik yöntemleri için polyfills sağlamak zorunda olacak.
Nasıl benim Subversion bulmak için ser...
Karşılaştırmak için nasıl "sürüm-...
gradle (sürüm) bir uygulama geliştirme...
Nasıl düzeltmek için: Desteklenmeyen ö...
Nasıl iPhone için Windows geliştirme m...