使用localeCompare排序时如何让大写字母优先?
实现大写优先的自定义字符串排序
你的问题在于localeCompare的默认排序逻辑是字典序优先:只有当两个字符串的核心字符(忽略大小写)完全一致时,caseFirst参数才会生效。但你需要的是大小写优先级高于后续字典序——只要某个位置的字符是大写对应小写,就直接让大写字符串排在前面,无需继续比较后续字符。
解决方案:自定义比较函数
以下是适配任意合法locale的自定义排序实现,严格满足你的需求:
function customCaseFirstSort(a, b, locale = "en-US") { const minLength = Math.min(a.length, b.length); for (let i = 0; i < minLength; i++) { const charA = a[i]; const charB = b[i]; // 适配locale的大小写转换,处理特殊语言(如土耳其语) const lowerA = charA.toLocaleLowerCase(locale); const lowerB = charB.toLocaleLowerCase(locale); if (lowerA !== lowerB) { // 核心字符不同时,按字典序排序 return lowerA.localeCompare(lowerB, locale); } else { // 核心字符相同时,大写优先 const isUpperA = charA.toLocaleUpperCase(locale) === charA; const isUpperB = charB.toLocaleUpperCase(locale) === charB; if (isUpperA && !isUpperB) return -1; if (!isUpperA && isUpperB) return 1; // 大小写相同则继续比较下一个字符 } } // 前缀完全匹配时,较短字符串排在前面 return a.length - b.length; } // 测试示例 const input = ["ADR 2023", "Added Values", "DEMO build", "DEMO Build", "2nd Outlook", "demo award"]; const output = input.sort((a, b) => customCaseFirstSort(a, b, "en-US")); console.log(output);
输出结果
["2nd Outlook", "ADR 2023", "Added Values", "DEMO Build", "DEMO build", "demo award"]
关键特性
- 支持任意合法5字符locale(如
zh-CN、fr-FR):通过toLocaleLowerCase/toLocaleUpperCase适配不同语言的大小写规则; - 严格遵循“大写字母始终排在对应小写字母之前”的规则,优先处理大小写差异,再考虑字典序;
- 数字开头的字符串会自然排在字母开头的字符串之前(符合默认排序逻辑)。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

