Hier ist die Versionsnummer der Software:
"1.0", "1.0.1", "2.0", "2.0.0.1", "2.0.1"
Wie kann ich das vergleichen? Angenommen, die richtige Reihenfolge ist:
"1.0", "1.0.1", "2.0", "2.0.0.1", "2.0.1"
Die Idee ist einfach ...: Lesen Sie die erste Ziffer, dann die zweite, danach die dritte ... Aber ich kann die Versionsnummer nicht in eine Float-Nummer umwandeln ... Sie können auch die Versionsnummer wie sehen Dies:
"1.0.0.0", "1.0.1.0", "2.0.0.0", "2.0.0.1", "2.0.1.0"
und das ist klarer zu sehen, was die Idee dahinter steckt ... Aber wie kann man es in ein Computerprogramm umwandeln? Hat jemand eine Idee, wie man das sortiert? Danke dir.
javascript
sorting
Tattat
quelle
quelle
Antworten:
Die Grundidee für diesen Vergleich wäre die Verwendung
Array.split
, Arrays von Teilen aus den Eingabezeichenfolgen abzurufen und dann Teilepaare aus den beiden Arrays zu vergleichen. Wenn die Teile nicht gleich sind, wissen wir, welche Version kleiner ist.Es sind einige wichtige Details zu beachten:
Hier ist der Code für eine Implementierung, die Sie direkt verwenden können ( Inhalt der Dokumentation ):
Diese Version vergleicht Teile auf natürliche Weise , akzeptiert keine Zeichensuffixe und betrachtet "1.7" als kleiner als "1.7.0". Der Vergleichsmodus kann in lexikografisch geändert werden, und kürzere Versionszeichenfolgen können mithilfe des optionalen dritten Arguments automatisch mit Nullen aufgefüllt werden.
Es gibt eine JSFiddle dass runs „Unit - Tests“ hier ; Es ist eine leicht erweiterte Version der Arbeit von ripper234 (danke).
Wichtiger Hinweis: Dieser Code verwendet
Array.map
undArray.every
, was bedeutet, dass er nicht in IE-Versionen vor 9 ausgeführt wird. Wenn Sie diese unterstützen müssen, müssen Sie Polyfills für die fehlenden Methoden bereitstellen.quelle
semver
Der von npm verwendete Parser für semantische Versionen.
$ npm semver installieren
Link zur semantischen Versionierung :
https://www.npmjs.com/package/semver#prerelease-identifiers
quelle
quelle
var len = Math.min(a_components.length, b_components.length);
Wird dazu führen, dass die Versionen 2.0.1.1 und 2.0.1 als gleich behandelt werden, oder?a = '7'
undb = '7.0'
zurückgeben,-1
da 7.0 länger ist. Hast du einen Vorschlag dafür? (console.log(compare("7", "7.0")); //returns -1
)Diese sehr kleine und dennoch sehr schnelle Vergleichsfunktion verwendet Versionsnummern beliebiger Länge und beliebiger Nummerngröße pro Segment .
Rückgabewerte:
- eine Zahl,
< 0
wenn a <b- eine Zahl,
> 0
wenn a> b-
0
wenn a = bSie können es also als Vergleichsfunktion für Array.sort () verwenden.
BEARBEITEN : Bugfixed Version entfernt nachgestellte Nullen, um "1" und "1.0.0" als gleich zu erkennen
quelle
["0.0.0", "0.0", "0.4.1", "0.5", "1.0.0", "1", "1.1", "1.2.15", "1.25.4", "2", "2.5.0", "2.5.10", "2.5.10.4159", "10.5"]
wo Ihr Code ausgegeben wird["0.0", "0.0.0", "0.4.1", "0.5", "1", "1.0.0", "1.1", "1.2.15", "1.25.4", "2", "2.5.0", "2.5.10", "2.5.10.4159", "10.5"]
, was vollkommen gleich ist, da 0.0 und 0.0.0 als gleich angesehen werden. Dies bedeutet, dass es unerheblich ist, ob '0.0' vor '0.0.0' liegt oder umgekehrt.Entnommen aus http://java.com/js/deployJava.js :
quelle
Ich konnte hier keine Funktion finden, die das tut, was ich wollte. Also habe ich meine eigenen geschrieben. Das ist mein Beitrag. Ich hoffe, jemand findet es nützlich.
Vorteile:
Verarbeitet Versionszeichenfolgen beliebiger Länge. '1' oder '1.1.1.1.1'.
Der Standardwert ist 0, wenn nichts angegeben ist. Nur weil eine Zeichenfolge länger ist, heißt das nicht, dass es sich um eine größere Version handelt. ('1' sollte mit '1.0' und '1.0.0.0' identisch sein.)
Vergleichen Sie Zahlen, keine Zeichenfolgen. ('3' <'21' sollte wahr sein. Nicht falsch.)
Verschwenden Sie keine Zeit mit nutzlosen Vergleichen in der Schleife. (Vergleichen für ==)
Sie können Ihren eigenen Komparator auswählen.
Nachteile:
Mein Code, ähnlich der akzeptierten Antwort von Jon :
Beispiele :
quelle
Einfache und kurze Funktion:
Tests:
quelle
Verzeihen Sie mir, wenn diese Idee bereits in einem Link besucht wurde, den ich nicht gesehen habe.
Ich hatte einige Erfolge bei der Umwandlung der Teile in eine gewichtete Summe wie folgt:
Das machte Vergleiche sehr einfach (Vergleich eines Doppelpacks). Unsere Versionsfelder sind nie mehr als 4 Stellen.
Ich hoffe, das hilft jemandem, da die vielen Bedingungen etwas übertrieben wirken.
quelle
Hier ist eine weitere Kurzversion, die mit einer beliebigen Anzahl von Unterversionen, gepolsterten Nullen und geraden Zahlen mit Buchstaben (1.0.0b3) funktioniert.
Ausgabe:
0 : a = b
1 : a> b
-1 : a <b
Code-Snippet anzeigen
https://jsfiddle.net/vanowm/p7uvtbor/
quelle
Antwort 2017:
Einfachster Code für moderne Browser:
Die Idee hier ist, Zahlen zu vergleichen, aber in Form einer Zeichenfolge. Damit der Vergleich funktioniert, müssen die beiden Zeichenfolgen gleich lang sein. so:
"123" > "99"
werden"123" > "099"
die Kurznummer „fix“ den Vergleich Klotzen
Hier fülle ich jeden Teil mit Nullen auf Längen von 10 auf und verwende dann einfach einen einfachen Zeichenfolgenvergleich für die Antwort
Beispiel:
quelle
compareVersion2
was genau passiert?substring
anstelle vonpadStart
für eine bessere Kompatibilität verwenden, dhvar zeros = "0000000000"; '0.2.32'.split('.').map( s => zeros.substring(0, zeros.length-s.length) + s ).join('.')
Sie erhalten0000000000.0000000002.0000000032
:)Überprüfen Sie die Funktion
version_compare()
aus dem php.js-Projekt . Es ist ähnlich wie bei PHPversion_compare()
.Sie können es einfach so verwenden:
quelle
Meine weniger ausführliche Antwort als die meisten Antworten hier
quelle
Obwohl diese Frage schon viel hat Antworten hat, wirbt jede für ihre eigene Hinterhoflösung, während wir dafür ein ganzes Ökosystem von (kampf-) getesteten Bibliotheken haben.
Eine schnelle Suche in NPM , GitHub , X gibt uns einige schöne Bibliotheken, und ich möchte einige durchgehen:
semver-compare
ist eine sehr leichte (~ 230B) Bibliothek, die besonders nützlich ist, wenn Sie nach Versionsnummern sortieren möchten, wenn die exponierte Methode der Bibliothek zurückgegeben wird-1
,0
oder1
entsprechend.Der Kern der Bibliothek:
compare-semver
ist ziemlich kräftig (~ 4,4 kB gezippt), ermöglicht aber einige nette, einzigartige Vergleiche, wie zum Beispiel das Min / Max eines Stapel von Versionen zu finden oder herauszufinden, ob die bereitgestellte Version einzigartig ist oder weniger als alles andere in einer Sammlung von Versionen.compare-versions
ist eine weitere kleine Bibliothek (~ 630B gzipped) und folgt der Spezifikation gut, was bedeutet, dass Sie Versionen mit Alpha / Beta-Flags und sogar Platzhaltern vergleichen können (wie bei Minor / Patch-Versionen:1.0.x
oder1.0.*
)Der Punkt ist: Es ist nicht immer erforderlich, Code aus StackOverflow zu kopieren und einzufügen, wenn Sie über den Paketmanager Ihrer Wahl anständige (Unit-) getestete Versionen finden.
quelle
Ich stand vor einem ähnlichen Problem und hatte bereits eine Lösung dafür gefunden. Probieren Sie es einfach aus.
Es gibt
0
fürequal
,1
wenn die Version ist ,greater
und-1
wenn es sich umless
quelle
Die Idee ist, zwei Versionen zu vergleichen und zu wissen, welche die größte ist. Wir löschen "." und wir vergleichen jede Position des Vektors mit der anderen.
quelle
quelle
Die
replace()
Funktion ersetzt nur das erste Vorkommen in der Zeichenfolge. Ersetzen wir also das.
durch,
. Löschen Sie anschließend alle.
und machen Sie das,
zu.
erneut und analysieren Sie es, um zu schweben.Zum Schluss sortieren Sie es:
quelle
Schauen Sie sich diesen Blog-Beitrag an . Diese Funktion funktioniert für numerische Versionsnummern.
quelle
Wenn wir beispielsweise überprüfen möchten, ob die aktuelle jQuery-Version kleiner als 1,8 ist,
parseFloat($.ui.version) < 1.8 )
würde dies ein falsches Ergebnis liefern, wenn die Version "1.10.1" ist, da parseFloat ("1.10.1") zurückgegeben wird1.1
. Ein String-Vergleich würde auch schief gehen, da"1.8" < "1.10"
ausgewertet wirdfalse
.Wir brauchen also einen solchen Test
Die folgende Funktion behandelt dies korrekt:
Hier sind einige Beispiele:
Hier finden Sie eine Live-Beispiel- und Testsuite: http://jsfiddle.net/mar10/8KjvP/
quelle
Hier ist eine Coffeescript-Implementierung, die für die Verwendung mit Array.sort geeignet ist und von anderen Antworten hier inspiriert wurde:
quelle
Ich habe ein Knotenmodul zum Sortieren von Versionen geschrieben. Sie finden es hier: version-sort
Eigenschaften :
Zögern Sie nicht, ein Problem zu öffnen, wenn Sie eine andere Funktion benötigen.
quelle
Dies funktioniert für numerische Versionen beliebiger Länge, die durch einen Punkt getrennt sind. Es wird nur dann true zurückgegeben, wenn myVersion> = minimumVersion ist, wobei davon ausgegangen wird, dass Version 1 kleiner als 1.0, Version 1.1 kleiner als 1.1.0 usw. ist. Es sollte ziemlich einfach sein, zusätzliche Bedingungen hinzuzufügen, z. B. Zahlen zu akzeptieren (einfach in eine Zeichenfolge konvertieren) und hexadezimal zu setzen oder das Trennzeichen dynamisch zu machen (einfach einen Trennzeichenparameter hinzufügen und dann das "." Durch den Parameter ersetzen).
Hier sind einige Tests:
Alternativ ist hier eine rekursive Version
quelle
Ich finde einen einfachsten Weg, sie zu vergleichen. Ich bin mir nicht sicher, ob es das ist, was Sie wollen. Wenn ich den folgenden Code in der Konsole ausführe, ist dies sinnvoll, und wenn ich die sort () -Methode verwende, kann ich das sortierte Array der Versionszeichenfolge abrufen. Es basiert auf der alphabetischen Reihenfolge.
quelle
Sie könnten
String#localeCompare
mit verwendenoptions
quelle
undefined
Obige, Sprache? Wie kommt es, dass du esundefined
ist der Gebietsschema-Teil, wird hier nicht verwendet.Könntest du sie nicht in Zahlen umwandeln und dann nach Größe sortieren? Fügen Sie Nullen an diejenigen an Zahlen mit einer Länge von <4 an
in der Konsole herumgespielt:
Je größer die Version, desto größer die Anzahl. Bearbeiten: muss wahrscheinlich angepasst werden, um größere Versionsserien zu berücksichtigen
quelle
Das ist ein ordentlicher Trick. Wenn Sie mit numerischen Werten zwischen einem bestimmten Wertebereich arbeiten, können Sie jeder Ebene des Versionsobjekts einen Wert zuweisen. Zum Beispiel wird "größter Wert" hier auf 0xFF gesetzt, was Ihrer Versionierung einen sehr "IP" -Look verleiht.
Dies behandelt auch die alphanumerische Versionierung (dh 1.2a <1.2b)
quelle
Ich mag die Version von @ mar10 , obwohl aus meiner Sicht die Möglichkeit eines Missbrauchs besteht (anscheinend ist dies nicht der Fall, wenn Versionen mit dem Semantic Versioning- Dokument kompatibel sind , kann aber der Fall sein, wenn eine "Build-Nummer" verwendet wird ):
Das Problem hierbei ist, dass Teilnummern der Versionsnummer in einigen Fällen mit ausgeschnittenen nachgestellten Nullen geschrieben werden (zumindest wie ich es kürzlich bei Verwendung einer anderen Software sehe), was dem rationalen Teil einer Nummer ähnlich ist, also:
Die erste (oder sowohl die erste als auch die zweite) Versionsunternummer wird jedoch immer als ganzzahliger Wert behandelt, dem sie tatsächlich entspricht.
Wenn Sie diese Art der Versionierung verwenden, können Sie im Beispiel nur einige Zeilen ändern:
Also jede Unternummer mit Ausnahme des ersten wird als Schwimmer verglichen werden, so
09
und1
wird worden0.09
und0.1
dementsprechend und richtig auf diese Weise verglichen.2054
und3
wird0.2054
und werden0.3
.Die vollständige Version lautet dann (Credits an @ mar10 ):
PS Es ist langsamer, aber es ist auch möglich, bei der Wiederverwendung derselben Vergleichsfunktion daran zu denken, dass die Zeichenfolge tatsächlich das Zeichenarray ist:
quelle
Ich habe dies basierend auf der Kons-Idee gemacht und es für die Java-Version "1.7.0_45" optimiert. Es ist nur eine Funktion, die eine Versionszeichenfolge in einen Float konvertieren soll. Dies ist die Funktion:
Die Zeichenfolge "1.7.0_45" wird in 1.0070000450000001 konvertiert und ist für einen normalen Vergleich ausreichend. Hier erklärter Fehler: Wie gehe ich mit der Genauigkeit von Gleitkommazahlen in JavaScript um? . Wenn Sie mehr als 3 Stellen benötigen, können Sie den Teiler ändern
Math.pow(10, i * 3);
.Die Ausgabe sieht folgendermaßen aus:
quelle
Ich hatte das gleiche Problem beim Versionsvergleich, aber mit Versionen, die möglicherweise etwas enthielten (dh Trennzeichen, die keine Punkte waren, Erweiterungen wie rc1, rc2 ...).
Ich habe dies verwendet, wodurch die Versionszeichenfolgen im Grunde genommen in Zahlen und Nicht-Zahlen aufgeteilt wurden, und versucht, sie entsprechend dem Typ zu vergleichen.
Für einige Fälle gibt es hier einige Annahmen, zum Beispiel: "1.01" === "1.1" oder "1.8" <"1.71". "1.0.0-rc.1" <"1.0.0" kann nicht verwaltet werden, wie in Semantic versionning 2.0.0 angegeben
quelle
Durch die Vorverarbeitung der Versionen vor dem Sortieren wird parseInt nicht unnötig mehrmals aufgerufen. Wenn ich eine Array # -Karte verwende, die dem Vorschlag von Michael Deal ähnelt, verwende ich folgende Sortierung, um die neueste Version eines dreiteiligen Standardsemvers zu finden:
quelle