标签:
在上一篇文章--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
标签:
原文地址:http://www.cnblogs.com/sharks007/p/5635828.html