我正在编写一个函数来比较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
答案 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')
失败的原因是您的代码首先将1
与1
进行比较,然后将1
与0
进行比较(因为它只是如果version1[i] < version2[i]
),然后0
到1
,则会中断。
自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)
由于以下原因,这些答案都不是最佳的:
您基本上希望从主要版本开始,然后继续使用次要版本。一旦你发现一个不相等的,你想要回来。当在函数(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;