SORU
26 Temmuz 2011, Salı


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
26 Temmuz 2011, Salı


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:

  1. 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
  2. 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andytokkallos

    Andytokkallo

    27 Kasım 2007
  • nigahiga

    nigahiga

    21 Temmuz 2006
  • SRI International

    SRI Internat

    30 NİSAN 2008