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

时间: 2024-07-29 15:56:42

js 比较版本号(二)的相关文章

js 比较版本号(一)

最近群了有人问如何比较版本号,我好奇的试了一下. 比较版本号,怎么办?懒人的方法是借鉴,先查网上的资料,看看有木有直接的帮过来的.而且直接便捷的好像在茫茫"文海"中,而且发现大多数是Java的,于是这里自己试了下用js 来比较,并试图找到简洁的比较方法. 比较版本号就是对字符串进行比较,这里结合正则表达式处理版本号. 首先,来比较常见的版本号 如 "2.2.3","2.3.0": js版本号比较--之版本1.0(ps:由于后面进行改进,因此对每次

【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨

摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装的一系列更加便于开发者使用,减少开发者工作量的二级API接口.除了官方通用的鱼骨.鹰眼控件,还有大量官方开发的地图插件,类似谷歌的lib.当然本文还会介绍自定义插件的使用. ------------------------------------------------------------------------------------------------- 第一部分 控件 目前官方支持的控件包含:缩放控制条-地图

JS调用产生二维码

之前一直采用的是java后台调用qrcode.jar的形式产生二维码,然后web前台展示的形式显示二维码,后来感觉如果能调用JS框架产生二维码的话不久更好.至少能减少与浏览器的交互次数,减轻后台的压力. 搜了一些资料后感觉没有一个拿来就能用的,至少IE浏览器的兼容还是有问题,通过自己的调试写了一个demo.希望能够帮助到大家,为大家节省时间 具体的demo可以通过http://download.csdn.net/detail/fugui6611634/7337467来下载 将一个字符串(可以是中

Backbone.js学习之二

经历一段自我修炼,终于领悟到Backbone.js的关键知识点,也发现了原来MVC可以在前端这样梦幻的发挥,Backbone.js确实是一个很有魅力的前端MVC框架. 练就一门技术,需要有扎实的功底,从这点,开始认真研究Backbone.js的一些最基本的操作,以便我日后学习能更上一层楼.那就切入主题: 什么是mvc? 简单的理解就是:模型(models),视图(views),控制器(collections).通过视图把浏览器的网址传给控制器,控制器对网址进行解析,然后去模型层获取数据,模型层将

CSipSimple最新版本号(二)--加入视频功能

前面我们编译好了最新版本号的CSipSimple,并且測试已经能够打电话了.如今要把视频功能加上去. 不知道怎么编译的,能够看我的上一篇博文:CSipSimple最新版本号 我们先来看一下之前的项目是怎么样的 如今来加入视频,在我们最開始检出CSipSimple的时候,检出的文件夹有 我们要把CSipSimpleVideoPlugin里面的内容整合到CSipSimple项目里面,就能完毕视频功能.过程例如以下: 首先下载视频功能所须要的库:http://down.51cto.com/data/1

进击Node.js基础(二)

一.一个牛逼闪闪的知识点Promise npm install bluebird 二.牛逼闪闪的Promise只需三点1.Promise是JS针对异步操作场景的解决方案 针对异步的场景,业界有很多解决方案,如回调.事件机制 Promise是一个对象,同时它也一种规范,针对异步操作约定了统一的接口,表示一个异步操作的最终结果以同步的方式来写代码,执行的操作是异步的,但是又保证程序的执行顺序是同步的. 原本是社区的一个规范的构想,被加入到ES6的语言标准里面,比如Chrom,Firefox浏览器已对

js生成简单二维码

js文件下载地址:https://download.csdn.net/download/weixin_38296752/10554485 一.引入qrcode.js文件 <script type="text/javascript" src="imgs/js/qrcode.js"></script> 二.定义用于展示二维码的div  并设置样式 <style type="text/css"> #qrcode{ p

从零开始的JS生活(二)——BOM、DOM与JS中的事件

上回书说道,JS中变量.运算符.分支结构.循环和嵌套循环等内容.本回就由本K给大伙唠唠JS中的BOM.DOM和事件. 一."花心大萝卜"--BOM 1.震惊,FFF团为何对BOM举起了火把--BOM简介 BOM(Browser Object Model) 是指浏览器对象模型,在JS中BOM是个不折不扣的花心大萝卜,因为它有很多个对象,其中代表浏览器窗口的Window对象是BOM的"正室".也就是最重要的,其他对象都是正室的下手.或者叫侧室也不足为过. 2.细数BOM

关于Js添加版本号

背景 在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css.js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css.js等,而不必从你的服务器读取,这样在一定程度上加快了网站的打开速度,又可以节约一下你的服务器流量. 问题 现在问题来了,.htaccess设置的css.js缓存都有一个过期时间,如果在访客的浏览器中已经缓存了css.js,在这些css.js缓存未过期之前,浏览器只会