Aquí está el número de versión del software:
"1.0", "1.0.1", "2.0", "2.0.0.1", "2.0.1"
¿Cómo puedo comparar esto? Suponga que el orden correcto es:
"1.0", "1.0.1", "2.0", "2.0.0.1", "2.0.1"
La idea es simple ...: lea el primer dígito, luego el segundo, después el tercero ... Pero no puedo convertir el número de versión en número flotante ... También puede ver el número de versión como esta:
"1.0.0.0", "1.0.1.0", "2.0.0.0", "2.0.0.1", "2.0.1.0"
y esto es más claro para ver cuál es la idea detrás ... Pero, ¿cómo convertirlo en un programa de computadora? ¿Alguien tiene alguna idea sobre cómo ordenar esto? Gracias.
javascript
sorting
Tattat
fuente
fuente
Respuestas:
La idea básica para hacer esta comparación sería utilizar
Array.split
para obtener matrices de partes de las cadenas de entrada y luego comparar pares de partes de las dos matrices; Si las partes no son iguales, sabemos qué versión es más pequeña.Hay algunos detalles importantes a tener en cuenta:
Aquí está el código para una implementación que puede usar directamente ( resumen con documentación ):
Esta versión compara partes naturalmente , no acepta sufijos de caracteres y considera que "1.7" es más pequeño que "1.7.0". El modo de comparación se puede cambiar a cadenas lexicográficas y las versiones más cortas se pueden rellenar con ceros automáticamente utilizando el tercer argumento opcional.
Hay un JSFiddle que ejecuta "pruebas unitarias" aquí ; Es una versión ligeramente ampliada del trabajo de ripper234 (gracias).
Nota importante: este código usa
Array.map
yArray.every
, lo que significa que no se ejecutará en versiones de IE anteriores a 9. Si necesita admitirlos, deberá proporcionar polyfills para los métodos que faltan.fuente
semver
El analizador de la versión semántica utilizado por npm.
$ npm instalar semver
Enlace de versiones semántico :
https://www.npmjs.com/package/semver#prerelease-identifiers
fuente
fuente
var len = Math.min(a_components.length, b_components.length);
hará que las versiones 2.0.1.1 y 2.0.1 sean tratadas como iguales, ¿verdad?a = '7'
yb = '7.0'
devoluciones-1
porque 7.0 es más largo. ¿Tienes alguna sugerencia para eso? (console.log(compare("7", "7.0")); //returns -1
)Esta función de comparación muy pequeña pero muy rápida toma números de versión de cualquier longitud y cualquier tamaño de número por segmento .
Valores devueltos:
- un número
< 0
si a <b- un número
> 0
si a> b-
0
si a = bEntonces puede usarlo como función de comparación para Array.sort ();
EDITAR: Versión corregida que elimina los ceros finales para reconocer "1" y "1.0.0" como iguales
fuente
["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"]
donde sus salidas de código["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"]
, lo cual es perfectamente lo mismo, ya 0.0 y 0.0.0 son considerados como iguales , lo que significa que es irrelevante si '0.0' está ante '0.0.0' o viceversa.Tomado de http://java.com/js/deployJava.js :
fuente
No pude encontrar una función haciendo lo que quería aquí. Entonces escribí el mío. Esta es mi contribución. Espero que alguien lo encuentre útil.
Pros:
Maneja cadenas de versiones de longitud arbitraria. '1' o '1.1.1.1.1'.
El valor predeterminado es 0 si no se especifica. El hecho de que una cadena sea más larga no significa que sea una versión más grande. ('1' debería ser lo mismo que '1.0' y '1.0.0.0'.)
Compara números, no cadenas. ('3' <'21' debe ser verdadero. No falso.)
No pierdas el tiempo en comparaciones inútiles en el bucle. (Comparando para ==)
Puedes elegir tu propio comparador.
Contras:
Mi código, similar a la respuesta aceptada por Jon :
Ejemplos :
fuente
Función simple y corta:
Pruebas:
fuente
Perdóname si esta idea ya ha sido visitada en un enlace que no he visto.
He tenido cierto éxito con la conversión de las partes en una suma ponderada de esta manera:
Lo que hizo que las comparaciones fueran muy fáciles (comparar un doble). Nuestros campos de versión nunca tienen más de 4 dígitos.
Espero que esto ayude a alguien, ya que los múltiples condicionales parecen un poco exagerados.
fuente
Aquí hay otra versión corta que funciona con cualquier número de sub versiones, ceros rellenos e incluso números con letras (1.0.0b3)
Salida:
0 : a = b
1 : a> b
-1 : a <b
Mostrar fragmento de código
https://jsfiddle.net/vanowm/p7uvtbor/
fuente
Respuesta 2017:
El código más simple para los navegadores modernos:
La idea aquí es comparar números pero en forma de cadena. Para que la comparación funcione, las dos cadenas deben tener la misma longitud. entonces:
"123" > "99"
volverse"123" > "099"
relleno del número corto "arreglar" la comparación
Aquí relleno cada parte con ceros a longitudes de 10. luego solo uso una comparación de cadena simple para la respuesta
Ejemplo:
fuente
compareVersion2
qué funciona exactamente?substring
lugar depadStart
una mejor compatibilidad, es decir,var zeros = "0000000000"; '0.2.32'.split('.').map( s => zeros.substring(0, zeros.length-s.length) + s ).join('.')
te dará0000000000.0000000002.0000000032
:)Compruebe el funcionamiento
version_compare()
del proyecto php.js . Es similar a PHPversion_compare()
.Simplemente puede usarlo así:
fuente
Mi respuesta menos detallada que la mayoría de las respuestas aquí
fuente
Aunque esta pregunta ya tiene mucho respuestas, cada una promueve su propia solución, mientras que tenemos un ecosistema completo de bibliotecas (de batalla) probadas para esto.
Una búsqueda rápida en NPM , GitHub , X nos dará algunas bibliotecas encantadoras, y me gustaría revisar algunas:
semver-compare
es una gran lib liviana (~ 230B) que es especialmente útil si desea ordenar por números de versión, como regresa el método expuesto de la biblioteca-1
,0
o de manera1
adecuada.El núcleo de la lib:
compare-semver
tiene un tamaño considerable (~ 4.4kB comprimido), pero permite algunas comparaciones únicas y agradables como encontrar el mínimo / máximo de una pila de versiones o averiguar si la versión proporcionada es única o menos que cualquier otra cosa en una colección de versiones.compare-versions
es otra pequeña lib (~ 630B gzipped) y sigue las especificaciones muy bien, lo que significa que puede comparar versiones con banderas alfa / beta e incluso comodines (como para versiones menores / parche:1.0.x
o1.0.*
)El punto es: no siempre es necesario copiar y pegar el código de StackOverflow, si puede encontrar versiones decentes probadas (por unidad) a través del administrador de paquetes de su elección.
fuente
Me enfrenté a un problema similar y ya había creado una solución para ello. Siéntase libre de probarlo.
Vuelve
0
paraequal
,1
si la versión esgreater
y-1
si esless
fuente
La idea es comparar dos versiones y saber cuál es la más grande. Eliminamos "." y comparamos cada posición del vector con la otra.
fuente
fuente
La
replace()
función solo reemplaza la primera aparición en la cadena. Entonces, reemplacemos.
con,
. Luego borre todo.
y vuelva,
a hacer el para.
analizarlo para que flote.finalmente, ordénelo:
fuente
Mira esta publicación de blog . Esta función funciona para números de versión numéricos.
fuente
Si, por ejemplo, queremos verificar si la versión actual de jQuery es inferior a 1.8,
parseFloat($.ui.version) < 1.8 )
daría un resultado incorrecto si la versión es "1.10.1", ya que devuelve parseFloat ("1.10.1")1.1
. Una comparación de cadenas también iría mal, ya que se"1.8" < "1.10"
evalúa comofalse
.Entonces necesitamos una prueba como esta
La siguiente función maneja esto correctamente:
Aquí hay unos ejemplos:
Vea aquí una muestra en vivo y un conjunto de pruebas: http://jsfiddle.net/mar10/8KjvP/
fuente
Aquí hay una implementación de coffeescript adecuada para usar con Array.sort inspirada en otras respuestas aquí:
fuente
Escribí un módulo de nodo para ordenar las versiones, puedes encontrarlo aquí: version-sort
Caracteristicas :
No dude en abrir un problema si necesita otra función.
fuente
Esto funciona para versiones numéricas de cualquier longitud separadas por un punto. Devuelve verdadero solo si myVersion es> = minimumVersion, suponiendo que la versión 1 es menor que 1.0, la versión 1.1 es menor que 1.1.0 y así sucesivamente. Debería ser bastante simple agregar condiciones adicionales como aceptar números (simplemente convertir a una cadena) y hexadecimal o hacer que el delimitador sea dinámico (solo agregue un parámetro delimitador y luego reemplace "." Con el parámetro)
Aquí hay algunas pruebas:
Alternativamente, aquí hay una versión recursiva
fuente
Encuentro la forma más simple de compararlos, no estoy seguro si es lo que quieres. cuando ejecuto el siguiente código en la consola, tiene sentido, y usando el método sort (), podría obtener la serie ordenada de cadenas de versiones. Se basa en el orden alfabético.
fuente
Podrías usar
String#localeCompare
conoptions
fuente
undefined
anterior, Idioma? ¿Cómo es que logras publicar esto mientras leo los otros;)undefined
es la parte local, no se usa aquí.¿no podrías convertirlos en números y luego ordenarlos por tamaño? Agregue 0 a los que están a los números que son <4 de longitud
jugado en la consola:
cuanto mayor sea la versión, mayor número. Editar: probablemente deba ajustarse para tener en cuenta la serie de versiones más grandes
fuente
Este es un buen truco. Si está tratando con valores numéricos, entre un rango específico de valores, puede asignar un valor a cada nivel del objeto de versión. Por ejemplo, "greatestValue" se establece en 0xFF aquí, lo que crea un aspecto muy "IP" en su versión.
Esto también maneja versiones alfanuméricas (es decir, 1.2a <1.2b)
fuente
Me gusta la versión de @ mar10 , aunque desde mi punto de vista, existe la posibilidad de mal uso (parece que no es el caso si las versiones son compatibles con el documento de versiones semánticas , pero puede ser el caso si se usa algún "número de compilación" ):
El problema aquí es que los subnúmeros del número de versión, en algunos casos, se escriben con ceros finales cortados (al menos como lo vi recientemente mientras uso un software diferente), que es similar a la parte racional de un número, entonces:
Sin embargo, el primer (o ambos, primer y segundo) subnúmero de versión siempre se trata como un valor entero al que realmente equivale.
Si usa este tipo de versiones, puede cambiar solo unas pocas líneas en el ejemplo:
Así que cada sub-serie excepto el primero se comparó como un flotador, así
09
y1
se convertirá en0.09
y0.1
por consiguiente y en comparación adecuadamente de esta manera.2054
y3
se convertirá0.2054
y0.3
.La versión completa, entonces, es (créditos a @ mar10 ):
PD: es más lento, pero también es posible pensar en reutilizar la misma función de comparación que opera el hecho de que la cadena es en realidad la matriz de caracteres:
fuente
Hice esto basado en la idea de Kons, y lo optimicé para la versión de Java "1.7.0_45". Es solo una función destinada a convertir una cadena de versión en un flotante. Esta es la función:
La cadena "1.7.0_45" se convierte a 1.0070000450000001 y esto es lo suficientemente bueno para una comparación normal. Error explicado aquí: ¿Cómo lidiar con la precisión del número de coma flotante en JavaScript? . Si necesita más de 3 dígitos en cualquier parte, puede cambiar el divisor
Math.pow(10, i * 3);
.La salida se verá así:
fuente
Tuve el mismo problema de comparación de versiones, pero con versiones que posiblemente contienen algo (es decir: separadores que no eran puntos, extensiones como rc1, rc2 ...).
Usé esto, que básicamente divide las cadenas de versión en números y no números, e intenta comparar en consecuencia con el tipo.
Aquí hay algunos supuestos para algunos casos, por ejemplo: "1.01" === "1.1" o "1.8" <"1.71". No puede administrar "1.0.0-rc.1" <"1.0.0", según lo especificado por Semantic versionning 2.0.0
fuente
El preprocesamiento de las versiones anteriores a la clasificación significa que parseInt no se llama varias veces innecesariamente. Usando Array # map similar a la sugerencia de Michael Deal, aquí hay un tipo que uso para encontrar la versión más nueva de un semver estándar de 3 partes:
fuente