JS写版本号排序,如传入参数[‘1.5’,‘2.0’,‘1.7’,‘1.1.5’] 返回 [‘1.1.5’,‘1.5’,‘1.7’,‘2.0’]
1.sort
let arr = ['1.5','2.0','1.7','1.1.5']
arr.sort(function(a,b){ return a>b?1:-1});
console.log(arr) //["1.1.5", "1.5", "1.7", "2.0"]
换个case可能存在错误 为什么字符串比较能够轻松的实现排序?
sort()
对数组中相邻的两个数进行比较 冒泡排序
若compareFunction返回值小于0,a排在b前面,即a与b的位置不变。
若compareFunction返回值等于0,a与b的位置不变。
若compareFunction返回值大于0,a排在b的后面,即a与b的位置交换。
即若返回值大于0的时候交换a与b的位置,其他情况位置不变。
所以,得出结论:
升序:return a - b
降序:return b - a
字符串不能做减法因为有‘.’的存在,所以只能比较大小来返回一个1或者-1进行排序
字符串比较这个技巧需要限定条件为各个版本号均为1位数字
若存在1.302.1和1.5.2,1.5.2会排在1.302.1后面,因为比较’5’>‘3’,返回之后不再比较了
2.改写sort,解决上面的问题
arr.sort((a, b) => {
let i = 0;
const arr1 = a.split('.');
const arr2 = b.split('.');
while (true) {
const s1 = arr1[i];
const s2 = arr2[i++];
if (s1 === s2) continue;
return s1 - s2;
}
});
3.不使用sort,两两比较+冒泡
function compare(version1, version2) {
// write code here
let len = Math.max(version1.length, version2.length)
let v1 = version1.split('.')
let v2 = version2.split('.')
for (let i = 0; i < len; i++) {
let n1 = parseInt(v1[i]) || 0
let n2 = parseInt(v2[i]) || 0
if (n1 > n2) {
return 1
} else if (n1 < n2) {
return -1
}
}
return 0
}
function sort(arr){
for(let i=arr.length;i>0;i--){
for(let j=0;j<i-1;j++){
if(compare(arr[j],arr[j+1])==1){
[arr[j],arr[j+1]] = [arr[j+1],arr[j]]
}
}
}
return arr
}
console.log(sort(['1.5', '2.0', '1.7', '1.1.5','1.304','3']))
//["1.1.5", "1.5", "1.7", "1.304", "2.0", "3"]