背景
刷LeetCode时,遇到一道简单的数组排序题:
问题
想着直接用js的数组sort自定义排序即可,奈何测试用例运行总是不通过,返回的一直都是原数组。
代码排查
复制代码到Firefox浏览器控制台运行,结果输出的是正确结果:[1, 2, 3, 4, 5]。
var sortBy = function (arr, fn) {
return arr.sort((a, b) => fn(a) > fn(b))
};
console.log(sortBy([5,4,1,2,3], (x)=>x)) // [1,2,3,4,5]
转换解题思路
估摸想着是不是题目不给用sort,想考考排序算法?接着写了一个冒泡排序,测试用例完美通过,一提交计算超时。。。
无奈下看了官方题解:
// 官方题解
var sortBy = function(arr, fn) {
return arr.sort((a,b) => fn(a) - fn(b))
};
发现排序自定义方法跟我的有些不同,我使用的是比较大小:fn(a) > fn(b),而官方则是用减法fn(a) - fn(b)。
原因
特意去MDN查询一番,发现compareFn应该返回数值,而不是Boolean值。新版的浏览器可能做了兼容。Array.prototype.sort() - JavaScript | MDN
结语
回想到曾经做过的项目,似乎也遇到过类似的场景,过去那么久了,本人还在这个坑上。。。
因此克服懒惰,写下这篇文章。