TypeScript中.sort()排序时3000未归位的原因探究
数字数组
sort()排序异常的原因及解决方法 问题根源
JavaScript的Array.sort()方法默认按字符串的Unicode码点顺序排序,而非数字的数值大小。
当你直接调用el.sort()时,数组里的所有数字会先被转换成字符串再比较:
- 比如
29000转成"29000",3000转成"3000" - 比较时从第一个字符开始:
"2"的Unicode码点(U+0032)小于"3"的码点(U+0033),所以"29000"会被判定为小于"3000",最终排在前面,导致3000出现在错误位置。
解决方法
要实现数字的数值排序,必须给sort()传入一个自定义比较函数:
// 升序排序(从小到大) el.sort((a, b) => a - b); // 降序排序(从大到小) el.sort((a, b) => b - a);
比较函数的逻辑很简单:
- 返回负数:
a排在b前面 - 返回正数:
b排在a前面 - 返回0:两者位置不变
用a - b时,若a数值小于b,结果为负,a靠前,正好对应升序;b - a则对应降序。
内容的提问来源于stack exchange,提问作者Zerox
相关产品推荐
相关产品推荐

