JS数组sort方法排序数字时100出现在首位的原因及解决方案
问题原因
- JavaScript 内置的
Array.prototype.sort()方法默认采用*字典序(Unicode 编码顺序)*进行元素比较,而非数值大小比较。 - 你的代码中先对
split得到的字符串数组执行排序,此时比较的是字符串的Unicode编码:字符串'100'的首个字符'1'的Unicode值小于'40'的首个字符'4',因此'100'会被排在'40'前面。后续执行map(Number)只是把排序后的字符串转成数字,不会调整已经确定的顺序。
解决方法
需要调整两个处理步骤的顺序,同时给sort方法传入数值比较的回调函数,指定按数值大小排序:
let number = '72 65 73 78 75 74 90 81 87 65 55 69 72 78 79 91 100 40 67 77 86'; // 先将分割得到的字符串数组统一转换为数字数组 let numberArray = number.split(' ').map(Number); // 传入数值比较回调,a - b 代表按数值升序排列 let sortedNumber = numberArray.sort((a, b) => a - b); console.log(sortedNumber);
执行后输出的排序结果为:
[40, 55, 65, 65, 67, 69, 72, 72, 73, 74, 75, 77, 78, 78, 79, 81, 86, 87, 90, 91, 100]
如果需要按数值降序排列,将回调修改为(a, b) => b - a即可。
内容的提问来源于stack exchange,提问作者Mentari_ER
相关产品推荐
相关产品推荐

