Javascript函数比较两个版本

时间:2011-10-28 16:04:16

标签: javascript algorithm version-control

我正在编写一个函数来比较2个版本,如果第二个版本比第一个版本大,则返回true。

但是我的算法有一个“洞”,我无法弄清楚如何修复。

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

这个例子按预期返回

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

5 个答案:

答案 0 :(得分: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 :(得分: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.

答案 2 :(得分:2)

你的问题是,如果你有1.1.0和1.0.1, 当你需要它时,函数不会到达中断

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

它不断比较数字直到结束。

你得到1&lt; 1 == false,if不运行

然后你得到1&lt; 0 == false,if不运行

然后0&lt; 1 == true,如果make result = true。 你需要:

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

答案 3 :(得分:1)

由于以下原因,这些答案都不是最佳的:

  1. 传入的参数可以是字符串。稍后您将它们转换为数组。这很昂贵,违背了良好的编码习惯。在初始化变量后,切勿改变变量的类型!创建一个新变量来保存数组。
  2. 即使在有足够的信息返回结果后,该功能也会继续循环。
  3. 您基本上希望从主要版本开始,然后继续使用次要版本。一旦你发现一个不相等的,你想要回来。当在函数(a,b)中执行大于,小于操作时,该函数的返回值应为:

    1 = a > b
    -1 = a < b
    0 = 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;
    };
    

答案 4 :(得分: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;