如何使用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
相关产品推荐
相关产品推荐

