Función Javascript para comparar dos versiones

Estoy escribiendo una function para comparar 2 versiones, y devuelvo verdadero si el segundo es más grande que la primera versión.

pero mi algorithm tiene un "agujero", y no puedo entender cómo solucionarlo.

function compareversion(version1,version2){ var result=false; if(typeof version1!=='object'){ version1=version1.toString().split('.'); } if(typeof version2!=='object'){ version2=version2.toString().split('.'); } for(var i=0;i<(Math.max(version1.length,version2.length));i++){ if(version1[i]==undefined){ version1[i]=0; } if(version2[i]==undefined){ version2[i]=0; } if(version1[i]<version2[i]){ result=true; break; } } return(result); } 

este ejemplo regresa como se esperaba

 compareversion('1','1') //false compareversion('1','1.0.0') //false compareversion('2.0','1.0.0') //false compareversion('1.1','1.2') //true compareversion('1','1.0.0.1') //true 

pero esto

 compareversion('1.1.0','1.0.1') //return true but should be false 

Esto debería funcionar:

 function compareversion(version1,version2){ var result=false; if(typeof version1!=='object'){ version1=version1.toString().split('.'); } if(typeof version2!=='object'){ version2=version2.toString().split('.'); } for(var i=0;i<(Math.max(version1.length,version2.length));i++){ if(version1[i]==undefined){ version1[i]=0; } if(version2[i]==undefined){ version2[i]=0; } if(Number(version1[i])<Number(version2[i])){ result=true; break; } if(version1[i]!=version2[i]){ break; } } return(result); } 

La razón por la cual la compareversion('1.1.0','1.0.1') falla es que su código primero compara 1 a 1 , luego 1 a 0 (no se rompe aquí ya que solo se rompe si la version1[i] < version2[i] ) y luego 0 a 1 .

Desde 0 < 1 , devuelve false .

Si la version1 está en ese índice más grande, sabrá que debería devolver falso. Solo necesitas continuar si son iguales.

  if(version1[i]<version2[i]){ result=true; break; } if(version1[i]>version2[i]){ result=false; break; } // Will only get here if both are equal, in all other // cases you broke out of the loop. So only continue // checking the next index when this one was equal. 

Su problema es que si tiene 1.1.0 y 1.0.1, la function no llega al descanso cuando lo necesita

 if(version1[i]<version2[i]){ result=true; break; } 

sigue comparando los numbers hasta el final.

obtienes 1 <1 == falso, el if no se ejecuta

entonces obtienes 1 <0 == falso, el si no se ejecuta

y luego 0 <1 == verdadero, si el resultado es verdadero. necesitarías:

 if(version1[i]<version2[i]){ return true; }else if(version1[i]>version2[i]){ return false; } 

Ninguna de estas respuestas es óptima por las siguientes razones:

  1. sus parameters pasados ​​pueden ser cadenas. más tarde los conviertes en una matriz. esto es costoso y va en contra de la buena práctica de encoding. ¡NUNCA cambie el tipo de una variable después de que se haya inicializado! Crea una nueva variable para mantener la matriz.
  2. La function continúa a través del ciclo incluso después de que tiene suficiente información para regresar con un resultado.

Básicamente, usted desea comenzar en la versión principal y trabajar hasta la versión menor. Tan pronto como encuentre uno que no sea igual, querrá regresar. Es estándar cuando se realiza una operación mayor a, menor que en la function (a, b) que el valor de retorno de la function sea:

 1 = a > b -1 = a < b 0 = a===b 

De lo contrario, cualquiera que llame a esta function no sabría para qué devuelve verdadero, a less que mire las partes internas de la misma. Si se minimiza y se ofusca, esto podría ser una pérdida de time.

He reescrito y mejorado la function con esto en mente.

 function (versionA, versionB) { var arrA, arrB; arrA = typeof versionA !== 'object' ? versionA.toString().split('.') : versionA; arrB = typeof versionB !== 'object' ? versionB.toString().split('.') : versionB; for (var i = 0; i < (Math.max(arrA.length, arrB.length)); i++) { arrA[i] = typeof arrA[i] === 'undefined' ? 0 : Number(arrA[i]); arrB[i] = typeof arrB[i] === 'undefined' ? 0 : Number(arrB[i]); if (arrA[i] > arrB[i]) { return 1; } if (arrA[i] < arrB[i]) { return -1; } } return 0; }; 
 version1 = version1.toString(); version2 = version2.toString(); var matchFound = false; if(version1.length != version2.length){ //Different Versions }else{ //They are the same length so compare each element FIND: for(var i = 0; i < version1.length; i++){ var match = version[i].match(version2[i]){ if(match == ""){ //Match found matchFound = true; break FIND; } } return matchFound; 
    Intereting Posts