JavaScript:如何对数字数组升序排序?代码失效求原因解析
嘿,很高兴能帮你搞定这两个JavaScript数组排序的问题!咱们一步步来梳理~
其实用数组自带的sort()方法就行,但有个关键细节要注意——直接用无参数的sort()对数字数组排序会翻车!因为它默认是把元素转成字符串,按Unicode码点来排的,比如[10, 2, 5].sort()会得到[10, 2, 5],完全不是你要的升序。
正确的姿势是给sort()传一个比较函数,写法很简单:
// 定义数字数组 const numberArray = [10, 2, 5, 8, 1]; // 升序排序 numberArray.sort((a, b) => a - b); console.log(numberArray); // 输出:[1, 2, 5, 8, 10]
原理也很好懂:比较函数返回a - b时,如果结果是负数,就把a排在b前面;如果是正数,把b排在a前面;等于0的话位置不变,刚好对应升序的逻辑。
要是你不想修改原数组(毕竟sort()是原地修改的),可以先复制一份再排序,比如用扩展运算符:
const original = [10, 2, 5]; const sorted = [...original].sort((a, b) => a - b); // 此时original还是[10,2,5],sorted是[2,5,10]
虽然你没贴出具体代码,但根据我日常帮人排查的经验,90%的情况都是下面这些问题:
坑一:没传比较函数,直接用
sort()
就像我刚才说的,默认排序逻辑是按字符串来的,数字数组这么用肯定不对,比如:const nums = [3, 10, 1]; nums.sort(); // 得到 [1, 10, 3],完全不符合预期坑二:比较函数写反了
要是你把比较函数写成(a, b) => b - a,那得到的就是降序数组,如果你的预期是升序,自然会觉得代码失效了。坑三:数组里混了非数字元素
比如数组里有字符串类型的数字,或者其他乱七八糟的类型:const mixedArray = [5, "2", 10, "abc"]; mixedArray.sort((a, b) => a - b);这里
"abc"和数字相减会得到NaN,sort()处理NaN的行为是不确定的,排序结果就会混乱。这种情况得先把数组里的元素统一转成数字再排序。坑四:误以为
sort()返回新数组
很多新手会犯这个错:以为sort()会返回一个新的排序后的数组,然后继续用原数组,结果发现原数组被改了,或者以为代码没生效。记住:sort()是原地修改原数组的,要保留原数组的话必须先复制!
内容的提问来源于stack exchange,提问作者Marius Foltea

