JS中sort()函数排序结果不符合预期的原因及解决方法
为什么JavaScript的array.sort()对带数字的字符串排序不符合预期?
嘿,这个问题我之前也踩过坑!咱们先来搞清楚为什么默认排序会得到这样的结果:
JavaScript数组的默认sort()方法,不是按数字大小排序,而是按字符串的Unicode编码顺序逐个字符对比。
拿你的例子来说,两个字符串"Population23"和"Population3",前面的"Population"部分完全一致,接下来对比后面的数字字符:
"Population23"的第10位字符是'2'(Unicode编码为50)"Population3"的第10位字符是'3'(Unicode编码为51)
因为'2'的编码比'3'小,所以默认排序会把"Population23"放在前面,这就和你预期的结果相反了。
那怎么修正呢?我们需要给sort()传入一个自定义比较函数,告诉它按照字符串里的数字大小来排序:
const array = ["Population23", "Population3"]; array.sort((a, b) => { // 提取字符串中的连续数字部分 const numA = parseInt(a.match(/\d+/)[0], 10); const numB = parseInt(b.match(/\d+/)[0], 10); // 按数字升序排列,若要降序则返回 numB - numA return numA - numB; }); console.log(array); // 输出: ["Population3", "Population23"]
这里的关键逻辑:
- 用正则
/\d+/匹配字符串里的连续数字片段,把数字从字符串中提取出来 - 用
parseInt()把提取到的数字字符串转换成整数,确保按数字大小比较 - 比较函数返回两个数字的差值,让
sort()方法按照数字的大小逻辑排序(返回负数则a排在b前,正数则b排在a前)
哪怕你的字符串里数字位置不固定,只要数字是连续的,这个方法也能正常工作。
内容的提问来源于stack exchange,提问作者zidanow
相关产品推荐
相关产品推荐

