前置知识
Array.prototype.sort()
方法。sort()
方法中若是回调函数,回调函数格式:(a, b) => { return xxx }
,其中a、b
为数组中任意值。
当返回值大于 0 时,a 放在 b 后面; 当返回值小于 0 时,a 放在 b 前面; 当返回值等于 0 时,ab 位置保持不变;
为什么 a - b
就是升序,b - a
就是降序???
当 a > b: a - b > 0 ,排序结果 ===> b,a (升序) b - a < 0 ,排序结果 ===> a,b (降序) 当 b > a: a - b < 0 ,排序结果 ===> a,b (升序) b - a > 0 ,排序结果 ===> b,a (降序) 当 a=b: a - b = b - a =0 , 排序结果 ===> 保持不变
由上可知:无论a>b还是b>a,return a-b
总能得到升序结果,而 return b-a
总能得到降序结果。
题设
/*
题目描述:有一组版本号如下['0.1.1', '2.3.3', '0.302.1', '4.2', '4.3.5', '4.3.4.5']。现在需要对其进行排序,
排序的结果为 ['4.3.5','4.3.4.5','2.3.3','0.302.1','0.1.1']
*/
function versionSort(arr) {
return arr.sort((a, b) => {
let i = 0; // 下标,一位一位取版本号数字
const a1 = a.split('.');
const b1 = b.split('.');
while(true) {
const s1 = a1[i];
const s2 = b1[i];
i++;
// 当版本号字符串长度不够时,取值为 undefined
if (s1 === undefined || s2 === undefined) {
return b1.length - a1.length
}
if (s1 === s2) continue;
// sort((a, b) => a - b)
// 返回值 > 0,a 在 b 后;返回值 < 0,a 在 b 前;(大后小前)
return s2 - s1
}
})
}
var version = ['0.1.1', '2.3.3', '0.302.1', '4.2', '4.3.5', '4.3.4.5', '4.3.5.1'];
versionSort(version) // ["4.3.5.1", "4.3.5", "4.3.4.5", "4.2", "2.3.3", "0.302.1", "0.1.1"]
上一篇:★★★ - 柯里化
下一篇:实现模板字符串解析功能