You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:20:01