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

JavaScript中使用localeCompare实现大写字母优先的对象数组排序

解决对象数组按指定大小写优先级排序的问题

要实现你需要的排序规则——先按lastName升序,相同则按firstName升序,且排序优先级为符号 > 数字 > 'A-Z' > 'a-z',可以通过调整localeCompare的参数来修正默认的大小写排序顺序,具体方案如下:

核心思路

localeCompare默认的大小写排序会把小写字母放在大写前面,我们可以通过配置caseFirst: 'upper'让大写字母优先于小写,同时设置sensitivity: 'case'确保大小写不同的字符串被明确区分。在排序函数中,先比较lastName,只有当lastName相等时再比较firstName。

代码示例

// 示例对象数组
const people = [
  { lastName: 'Smith', firstName: 'alice' },
  { lastName: 'smith', firstName: 'Bob' },
  { lastName: '123Doe', firstName: 'Charlie' },
  { lastName: '@Doe', firstName: 'David' },
  { lastName: 'Smith', firstName: 'Alice' },
];

// 自定义排序函数
people.sort((a, b) => {
  // 先比较lastName
  const lastNameSort = a.lastName.localeCompare(b.lastName, undefined, {
    caseFirst: 'upper', // 让大写字母优先排序
    sensitivity: 'case' // 严格区分大小写
  });
  
  // 如果lastName不同,直接返回排序结果
  if (lastNameSort !== 0) {
    return lastNameSort;
  }
  
  // lastName相同时,比较firstName
  return a.firstName.localeCompare(b.firstName, undefined, {
    caseFirst: 'upper',
    sensitivity: 'case'
  });
});

console.log(people);

排序结果验证

运行上述代码后,数组会按照预期顺序排列:

[
  { lastName: '@Doe', firstName: 'David' },
  { lastName: '123Doe', firstName: 'Charlie' },
  { lastName: 'Smith', firstName: 'Alice' },
  { lastName: 'Smith', firstName: 'alice' },
  { lastName: 'smith', firstName: 'Bob' }
]

完全符合符号 → 数字 → 大写字母开头字符串 → 小写字母开头字符串的优先级,且相同姓氏下名字也按此规则排序。

兼容性备选方案

如果需要兼容不支持caseFirst参数的老环境,可以通过先比较字符串的大写版本,再比较原字符串的方式实现:

people.sort((a, b) => {
  // 先比较lastName的大写形式,确保同姓氏的项排在一起
  const lastNameUpperCompare = a.lastName.toUpperCase().localeCompare(b.lastName.toUpperCase());
  if (lastNameUpperCompare !== 0) {
    return lastNameUpperCompare;
  }
  // 大写相同则比较原字符串,保证大写开头的项排在小写前面
  const lastNameOriginalCompare = a.lastName.localeCompare(b.lastName);
  if (lastNameOriginalCompare !== 0) {
    return lastNameOriginalCompare;
  }
  // 同理处理firstName
  const firstNameUpperCompare = a.firstName.toUpperCase().localeCompare(b.firstName.toUpperCase());
  if (firstNameUpperCompare !== 0) {
    return firstNameUpperCompare;
  }
  return a.firstName.localeCompare(b.firstName);
});

内容的提问来源于stack exchange,提问作者Ram Chandran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:13:48