通用判断版本号是否在两者之间,也可以搭配判断是否大于某版本号,小于取反即可
PS:需确保版本规范一致,比如都是.号分割的n位版本号
1 var APP = {}; 2 3 //判断指定版本是否在版本范围之间,需确保版本规范一致;比如 (1.0.5,1.1.8,3.1.6) 4 APP.betweenVersion = function(curr,start,end,separator){ 5 if(curr == start || curr == end){ 6 return true; 7 } 8 9 var separator = separator || '.'; 10 var curr = curr.split(separator); 11 var start = start.split(separator); 12 var end = end.split(separator); 13 var gtStart = false; 14 var ltEnd = false; 15 16 gtStart = APP.gtTargetVersion( APP.compareVersionEle(curr,start) ); 17 18 if(!gtStart){ 19 return false; 20 } 21 22 return !APP.gtTargetVersion( APP.compareVersionEle(curr,end) ); 23 24 }; 25 APP.compareVersionEle = function(curr,target){ 26 var len = curr.length; 27 var temp = []; 28 var left,right; 29 30 for(var i=0;i<len;i++){ 31 32 left = +curr[i]; 33 right = +target[i]; 34 35 if(left == right){ 36 temp.push(0); 37 }else if(left > right){ 38 temp.push(1); 39 }else{ 40 temp.push(-1); 41 } 42 } 43 return temp; 44 }; 45 46 APP.gtTargetVersion = function(arr){ 47 var res = true; 48 var curr,next; 49 50 for(var i=0,len=arr.length;i<len;i++){ 51 curr = arr[i]; 52 next = arr[i+1]; 53 54 if( curr>next ){ 55 if(curr == 0){ 56 res = false; 57 break; 58 } 59 if(curr == 1){ 60 res = true; 61 break; 62 } 63 64 }else if(curr == next){ 65 if(curr == -1){ 66 res = false; 67 break; 68 } 69 if(curr == 1){ 70 res = true; 71 break; 72 } 73 }else{ 74 if(curr == -1){ 75 res = false; 76 break; 77 } 78 if(curr == 0){ 79 res = true; 80 break; 81 } 82 } 83 } 84 // console.log(res); 85 return res; 86 } 87 88 var res = APP.betweenVersion('1.2.100.10','1.3.10.2','3.1.1.16','.'); 89 console.log(res);
当前项目有需要判断指定版本是否在两个版本之间这个需求,百度谷歌找了一圈,代码都是有局限性的,无法通用,甚至是一堆错误的东西转来转去......
当前方法有两个要点,一个是需要将切开的版本号转为数值型数组,还有一个是对比大小的时候转为 -1 0 1 三个数值的对比,这样,无论隔开的版本号有多大,总体分为几段,都可以正确比对.
以上代码多处理一遍大于小于,但逆向思维一下,第三个方法是不需要的了,只需要前面两个方法返回差值即可,不需要另外再判断.
下面是同行提供的简略版,只以0为基点判断,无需再生成数组判断一遍,两个方法即可搞定,此方法即使传入不规范版本号也可判断,缺陷是当一个版本长,一个版本短的时候,即使表达的意思一样,也会判断不等,比如 1.0 和 1.0.0;建议使用者传入版本号为一致的位数.
1 var APP = {}; 2 3 // if ver is between lower and upper (inclusive) 4 APP.betweenVersion = function (ver, lower, upper, separator) { 5 return this.compareVersion(ver, lower, separator) >= 0 6 && this.compareVersion(ver, upper, separator) <= 0; 7 }; 8 9 // =0 equal, <0 less, >0 greater 10 APP.compareVersion = function (ver, target, separator) { 11 if (ver == target) return 0; 12 13 separator = separator || '.'; 14 ver = ver.split(separator); 15 target = target.split(separator); 16 var len = Math.min(ver.length, target.length); 17 var num1, num2; 18 for (var i = 0; i < len; i++) { 19 num1 = +ver[i]; 20 num2 = +target[i]; 21 if (num1 !== num2) return num1 - num2; 22 } 23 24 return ver.length - target.length; 25 }; 26 27 var res = APP.betweenVersion('1.0', '0.9', '1.0.1', '.'); 28 console.log(res); // true
第二种简略方法,还是逆向思维,0为基点,不等于直接return,无需统一再判断,不同标准规范的版本号无法正确判断,使用者自行传入规范一致的版本号,这里限制了长度为4,使用的时候手动改下,或者定义一个长度为a或者b的长度为宜
第二种方法还有一个优点是切开版本号的时候上了正则,无需判断版本号是什么分割开的,只需要不是数字即可(不会有人用数字分割的,-)
1 var varsion={ 2 between:function(version, lower, upper){ 3 return this.compare(version,lower)>=0 4 && this.compare(version,upper)<=0; 5 }, 6 compare:function(a,b){ 7 var a=a.split(/[^\d]+/g),b=b.split(/[^\d]+/g); 8 for(var i=0;i<4;i++){ 9 if((a[i]||0) < (b[i]||0)) return -1; 10 else if((a[i]||0) > (b[i]||0))return 1; 11 } 12 return 0; 13 } 14 };
综合以上代码,个人觉得,使用的时候还是传入一致的版本号为好,要不然,就得内部补齐位数来容错,否则都各有缺陷
综合代码:
1 //使用的时候传入长度一致的版本号,如('0.12.2','0.9.0','1.3.6') 2 var varsion={ 3 between:function(version, lower, upper){ 4 return this.compare(version,lower)>=0 5 && this.compare(version,upper)<=0; 6 }, 7 compare:function(a,b){ 8 var a=a.split(/[^\d]+/g),b=b.split(/[^\d]+/g); 9 var len = a.length; 10 for(var i=0;i<len;i++){ 11 if((a[i]||0) != (b[i]||0)) return a[i]-b[i]; 12 } 13 return 0; 14 } 15 };
感谢评论的朋友.