zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    UML建模语言
    iOS 键盘挡住UITextField
    IOS架构师之路:我对IOS架构的点点认识(大纲)
    自己动手写处理器之第四阶段(1)——第一条指令ori的实现
    【Android Studio】studio学习系列(一) 从eclipse导入project
    Android二维码开源项目zxing编译
    第九十六题(编写strcpy 函数)
    oracle子查询
    打印池
    咏南中间件和开发框架介绍文档下载
  • 原文地址:https://www.cnblogs.com/zengnificant/p/5635828.html
Copyright © 2011-2022 走看看