2011-10-28 178 views
4

Im寫一個函數來比較2個版本,如果第二個版本大於第一個版本,則返回true。Javascript函數來比較兩個版本

但我的算法有一個「洞」,我無法弄清楚如何修復。

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); 
} 

這exemples回報預期

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 

但這

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

回答

7

這應該工作:

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); 
} 

原因compareversion('1.1.0','1.0.1')失敗是你的代碼首先比較11,然後10(它沒有打破這裏,因爲它僅僅取消,如果version1[i] < version2[i])和然後01。由於0 < 1,它返回false

+1

例如,如果我們比較'11.1.2'和'3.1.2',算法不能正常工作。在比較之前,您應該將字符串轉換爲整數。請解決這個問題!順便說一句好的算法! –

+0

@TamasPap:好點。固定。 – Dennis

+0

這裏是小提琴它是如何工作的(正在測試它是否適合我)http://jsfiddle.net/fgprj51p/ – Grzegorz

4

如果version1是在這個指數越大,你知道它應該返回false。你只需要繼續,如果他們是平等的。

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. 
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; 
+0

這個函數有問題,比較1.0到1.0.0應該是相同的版本。 –

+0

我假定版本號會遵循格式。對於那個很抱歉。 –

2

你的問題是,如果你有1.1.0和1.0.1, 功能沒有達到休息的時候,你就需要

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

它保持到最後比較的數字。

你得到1 < 1 == false時,如果不運行

那麼你得到1 < 0 == false時,如果不運行

,然後0 < 1 ==真,如果使結果=真。 你將需要:

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

以上答案都不是最佳的,原因如下:在可以是字符串傳遞

  1. 您的參數。稍後將其轉換爲數組。這是昂貴的,違背了良好的編碼習慣。在變量初始化之後,切勿改變其類型!創建一個新的變量來保存數組。
  2. 即使函數有足夠的信息返回結果,該函數仍會繼續循環。

你基本上想從主要版本開始,並向下工作到次要版本。只要你找到一個不相等的東西,你就想回來。

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

否則,任何調用這個函數會不知道它的返回true:做一個大於,小於在功能操作(A,B),該函數的返回值應該是當它是標準除非他們看到它的內部。如果縮小和混淆,這可能是浪費時間。

我已經改寫並改進了這個功能。

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; 
};