为何JavaScript的array.sort处理含1000以上数值的数组时排序异常?
为什么JavaScript的Array.sort()对大数值排序异常?
这是个新手很容易踩的坑!JavaScript里的Array.sort()方法默认是按字符串的Unicode编码顺序排序,根本不是按数值大小来的——你的第一个例子只是碰巧结果和数值排序一致而已。
咱们拆解下你的两个例子:
- 对于
firstArr = [1,10,5,15],转成字符串后是["1","10","5","15"]。按Unicode排序时,"1"开头的字符串会排在"5"前面;而"10"和"15"比,第二个字符"0"的编码比"5"小,所以顺序是["1","5","10","15"],刚好和数值升序结果重合,这才给了你它是按数值排序的错觉。 - 但到了
secondArr = [1000,500,999,150],转字符串后是["1000","500","999","150"]。按Unicode规则,"1"开头的字符串优先级高于"5"和"9"开头的;再看"1000"和"150",第一个字符都是"1",第二个字符"0"的编码比"5"小,所以"1000"会排在"150"前面,最终就出现了[1000, 150, 500, 999]这种看似混乱的结果。
要解决这个问题,只需要给sort()传一个比较函数,明确指定按数值排序的规则:
var secondArr = [1000, 500, 999, 150]; // 升序排序 secondArr.sort((a, b) => a - b); // 结果:[150, 500, 999, 1000] // 如果需要降序,就改成b - a secondArr.sort((a, b) => b - a); // 结果:[1000, 999, 500, 150]
这个比较函数的逻辑很简单:
- 返回
a - b时,若结果为负,a排在b前面(升序);若为正,b排前面;为0则位置不变。 - 返回
b - a则刚好反过来,实现降序排序。
这样不管数组里的数值是大是小,都能按照你预期的数值顺序排序了。
内容的提问来源于stack exchange,提问作者JustenPhelps
相关产品推荐
相关产品推荐

