javascript通用判断版本号是否在版本范围之间代码

通用判断版本号是否在两者之间,也可以搭配判断是否大于某版本号,小于取反即可

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

感谢评论的朋友.

 

你可能感兴趣的:(javascript通用判断版本号是否在版本范围之间代码)