Lodash sortBy多键排序不符合预期 大小写排序顺序异常
排序异常原因
_.sortBy默认沿用JavaScript原生字符串比较逻辑,按单个字符的Unicode码点值判定大小- 大写字母的Unicode码点区间为
U+0041-U+005A,小写字母的码点区间为U+0061-U+007A,所有大写字母的码点都小于小写字母 - 你提到的两个词条中,
Tetrachloroethene首字母为大写T(码点值84),cis-1,2-Dichloroethene首字母为小写c(码点值99),默认比较逻辑会判定大写T对应值更小,因此T开头的词条排在前面,和字母表顺序无关,完全是大小写差异导致的。
修正方法
不要直接传入字段名数组作为排序依据,改用自定义迭代函数,将参与排序的字符串统一转为全小写(或全大写)后再比较,即可实现不区分大小写的正确排序:
var temp = _.sortBy(array, [ function (item) { return item.Chemical.toLowerCase(); }, function (item) { return item.LocName.toLowerCase(); } ]);
如果需要适配带数字、特殊符号的词条,得到更符合日常阅读习惯的自然排序结果,可以使用原生Intl.Collator实现本地化排序:
// 初始化英文排序比较器,忽略大小写、重音差异 const enCollator = new Intl.Collator('en', { sensitivity: 'base' }); var temp = array.sort(function(a, b) { const chemicalCompare = enCollator.compare(a.Chemical, b.Chemical); if (chemicalCompare !== 0) return chemicalCompare; return enCollator.compare(a.LocName, b.LocName); });
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

