js 比较版本号(二)

    在上一篇文章--js 比较版本号(一)中,笔者利用js使用自己的方法复杂的处理了下只有一对字符串的版本号比较。为什么复杂呢,  因为不适用一堆版本号的比较,需要更多的代码,那有又如何解决呢? 

     事实上,js已经为我们封装好了排序函数sort(),能很好的便捷解决字符串比较,排序的问题,真是"踏破铁鞋无觅处,得来全不费工夫"。

     w3c上有很好的2个例子[1],搬过来码在这里:

      测试1:

var a=["10","5","40","25","1000","1"];
      
      console.log(a);
      console.log(a.sort());   

     结果:

["10", "5", "40", "25", "1000", "1"]
["1", "10", "1000", "25", "40", "5"]

      测试二:

function sortNumber(a,b)
{
return a - b
}
var a=["10","5","40","25","1000","1"];
      
      console.log(a);
      console.log(a.sort(sortNumber));   

       结果: 

["10", "5", "40", "25", "1000", "1"]
["1", "5", "10", "25", "40", "1000"]

     似乎达到目的了,但真的如此吗?在测试数组中的每个元素加上"1." :

      测试三: 

function sortNumber(a,b)
{
return a - b
}
var a=["1.10", "1.5", "1.40", "1.25", "1.1000", "1.1"];
      
      console.log(a);
      console.log(a.sort(sortNumber));   

     结果:

["1.10", "1.5", "1.40", "1.25", "1.1000", "1.1"]
["1.10", "1.1000", "1.1", "1.25", "1.40", "1.5"] 

    和预想的不太一样,1.10跑到1.5前面去了,什么鬼?难道没办法了吗,sort()解决不了版本号排序的问题了吗?

    答案是否定的。 sort(sortNumber) 解决的一个问题是,对整数型数字字符串组能够很好的排序,因为sortNumber能对整数比较大小。试想一下,如果有一个函数(sortVersions),能对版本号格式的字符串比较大小,那么sort(sortVersions) 能否对任意版本号格式的字符串组排序呢 ?如果能的话,上一篇做的比较就派上用场了。只需对上一篇中的函数做下改进,就Ok了。于是,升级版的版本号比较--排序就形成了:

js版本号比较之--版本2.0

//假定字符串的每节数都在5位以下
//去除数组空值||空格
if(!Array.prototype.trim){
    Array.prototype.trim=function(){
     var  arr=[];this.forEach(function(e){
      if(e.match(/S+/))  arr.push(e);
    })
  return arr;
 }  
}

//提取数字部分
function toNum(a){
 var a=a.toString();
var c=a.split(/D/).trim();
  var num_place=["","0","00","000","0000"],r=num_place.reverse();
  for (var i=0;i<c.length;i++){
    var len=c[i].length;
             c[i]=r[len]+c[i];
   }
 var res= c.join('');
 return res;
 } 

//提取字符
function toChar(a){
  var a=a.toString();
  var c=a.split(/.|d/).join('');
  return c;
}

function sortVersions(a,b){

 var _a1=toNum(a), _b1=toNum(b);
  if  (_a1!==_b1) return _a1-_b1;
 else {
      _a2= toChar(a).charCodeAt(0).toString(16);
      _b2= toChar(b).charCodeAt(0).toString(16);
       return _a2-_b2;
     }
}

var arr1=["10", "5", "40", "25", "1000", "1"];
var arr2=["1.10", "1.5", "1.40", "1.25", "1.1000", "1.1"];
console.log(arr1.sort(sortVersions))
console.log(arr2.sort(sortVersions))

结果:

["1", "5", "10", "25", "40", "1000"]
["1.1", "1.5", "1.10", "1.25", "1.40", "1.1000"]

再来一组:

  测试四:

//在版本2.0测试的chrome控制台上继续的测试
var arr3=["2.0a", "2.1", "2.1a", "2.10b", "2.10a", "2.1b"];

console.log(arr3)
console.log(arr3.sort(sortVersions))

结果:

["2.0a", "2.1", "2.1a", "2.10b", "2.10a", "2.1b"]
["2.0a", "2.1", "2.1a", "2.1b", "2.10a", "2.10b"]

   至此,版本号的比较就告一段落了。

   小结一下:

  1.用到了js有关的哪些知识:正则表达式,console,Array()及其拓展的方法,sort()及其参数编写,字符转ASCII码

  2.文中可以看出,发散性思维不够,需要多加锻炼:往往有些看似难得问题,变通一下,跳出"框",会发现,难点原来那么基础

  3.向其他的文章发布者致敬,代码本地测试正确,发布后仍正确的太不容易了

   文中未解决的问题:

   1.含多个字符的版本号的比较

  2.能否自己编写个排序的程序呢

  3.其他bug和不足

 文献引用:[1]JavaScript sort() 方法 http://www.w3school.com.cn/jsref/jsref_sort.asp

原文地址:https://www.cnblogs.com/zengnificant/p/5635828.html