JavaScript数组特殊排序求助:含大小写字母与数字的数组排序
解决JavaScript数组自定义排序问题
原始数组
let originalArray = ["Apple","apple","Acrobat","APPLE","Account","account","Banana","banana","carrot","Carrot",1,2,"BANANA","BB","AA"];
期望输出
sortedArray = ["AA","APPLE","Account","Acrobat","Apple","account","apple","BANANA","BB","Banana","banana","Carrot","carrot",1,2];
问题分析
你之前的代码存在两个核心问题:
- 错误使用
a[keyname],数组元素是直接的字符串/数字,并非对象属性,无需额外属性访问; - 未处理数字与字符串的排序优先级,导致数字可能混杂在字符串序列中。
解决方案
通过自定义排序函数实现以下规则:
- 数字排在所有字符串之后,且按数值升序排列;
- 字符串按英文字典序排序,大写形式优先于小写形式(如
AA>APPLE>Account>account)。
完整代码
let originalArray = ["Apple","apple","Acrobat","APPLE","Account","account","Banana","banana","carrot","Carrot",1,2,"BANANA","BB","AA"]; // 创建原数组副本,避免修改原数组 let sortedArray = [...originalArray].sort((a, b) => { // 判断元素是否为数字 const isANumber = typeof a === 'number'; const isBNumber = typeof b === 'number'; // 数字排最后:一个是数字一个是字符串时,数字靠后 if (isANumber && !isBNumber) return 1; if (!isANumber && isBNumber) return -1; // 都是数字则按数值大小排序 if (isANumber && isBNumber) return a - b; // 字符串排序:大写优先,按英文字典序 return a.localeCompare(b, 'en', { caseFirst: 'upper', // 大写形式排在前面 sensitivity: 'base' // 忽略大小写差异但保留大小写顺序 }); }); console.log(sortedArray);
代码说明
- 使用
[...originalArray]复制原数组,避免直接修改原数组的引用; - 通过
typeof判断元素类型,确保数字始终处于排序结果的末尾; localeCompare的caseFirst: 'upper'参数保证大写字符串优先,sensitivity: 'base'确保同一字母的大小写视为同源字符,维持排序逻辑的一致性。
内容的提问来源于stack exchange,提问作者Chaitenya Rajurkar
相关产品推荐
相关产品推荐

