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

如何使用Lodash的orderBy对含非ASCII字符的集合排序?

解决包含非ASCII字符的对象数组排序问题

问题分析

你当前的代码存在两个核心错误:

  • Array.sort()是原地排序,执行后原users数组已被修改,nameLocale和users指向同一个引用,后续用_.orderBy时把整个数组作为排序条件完全不符合API要求。
  • _.orderBy的第二个参数应为排序字段或自定义排序函数,你传了已排序的数组,逻辑完全错误。

正确实现方式

方式1:使用Lodash的_.orderBy

直接传入自定义排序函数处理name的本地化排序,再指定age作为次要排序条件,同时配置语言规则确保á按预期排序:

const users = [
  { name: 'A', age: 48 },
  { name: 'B', age: 34 },
  { name: 'á', age: 40 },
  { name: 'b', age: 36 }
];

// 按name本地化升序(á排在A前),再按age升序排序
const sortedUsers = _.orderBy(users, [
  (item) => item.name,
  'age'
], ['asc', 'asc'], {
  comparator: (a, b) => a.localeCompare(b, 'pt', { 
    sensitivity: 'base',
    caseFirst: 'upper'
  })
});

console.log(sortedUsers);

方式2:使用原生JavaScript的Array.sort

无需依赖Lodash,直接用原生排序结合多条件判断,同时创建数组副本避免修改原数据:

const users = [
  { name: 'A', age: 48 },
  { name: 'B', age: 34 },
  { name: 'á', age: 40 },
  { name: 'b', age: 36 }
];

// 先按name本地化排序,name相同时按age升序
const sortedUsers = [...users].sort((a, b) => {
  const nameCompare = a.name.localeCompare(b.name, 'pt', {
    sensitivity: 'base',
    caseFirst: 'upper'
  });
  return nameCompare !== 0 ? nameCompare : a.age - b.age;
});

console.log(sortedUsers);

关键配置说明

  • localeCompare的第二个参数'pt'(葡萄牙语)是确保á排在A前的核心,若你的目标语言是西班牙语可替换为'es'。
  • sensitivity: 'base':忽略重音和大小写的细微差异,保证基础字符排序逻辑统一。
  • caseFirst: 'upper':让大写字母(如B)排在对应小写字母(如b)前面,符合你的预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:45:36