版本号排序

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"]

猜你喜欢

转载自blog.csdn.net/weixin_45284354/article/details/113886473