Intl.Collator 是 JavaScript 中专为国际化排序设计的核心 API,支持中文拼音、笔画、部首及日韩文等自然排序,关键在正确配置 locale(如 zh-Hans、zh-TW)和 options(如 sensitivity、numeric: true),无需手动转拼音。

Intl.Collator 是 JavaScript 中专为国际化排序设计的核心 API,它能自动处理中文的拼音序、笔画序、部首序,同时兼容日文假名、韩文音节、繁简混排、带声调拼音、甚至中英混合文本的自然排序——关键在于正确配置 locale 和 options,而非手动转拼音或查表。
明确中文排序的 locale 选择逻辑
中文排序效果高度依赖 locale 参数,不同值触发不同默认规则:
- zh-Hans(简体中文):默认按《现代汉语词典》拼音顺序,支持多音字上下文识别(如“重庆”读作 Chóngqìng 而非 Qìng)
- zh-Hant(繁体中文):按台湾《国语辞典》排序,对异体字、旧字形更敏感(如「裡」与「里」视为不同)
- zh-CN / zh-TW / zh-HK:更精确对应地域规范,例如 zh-HK 默认启用粤语拼音(Jyutping)辅助排序
- 仅用 'zh':行为不确定,应避免;浏览器可能回退到系统 locale 或默认拼音序
用 sensitivity 控制大小写、变音符与宽度差异
中文虽无大小写,但数组常含英文、数字、标点或全角/半角混排。sensitivity 选项决定这些字符是否影响排序位置:
-
sensitivity: 'base':忽略大小写、重音、全半角差异(推荐用于用户搜索列表)
→ “苹果”、“蘋果”、“Apple”、“apple” 可能被归为一类 -
sensitivity: 'accent':区分重音和变音符,但忽略大小写(适合带声调拼音排序)
→ “mā” 和 “má” 视为不同,但 “Ma” 和 “ma” 相同 - sensitivity: 'case':仅区分大小写(中文无效,但影响英文字段)
- sensitivity: 'variant':最严格,默认值;区分全角/半角、大小写、重音等(适合数据校验场景)
启用 numeric: true 解决数字字符串乱序问题
中文数组中常见 “第1章”、“第10节”、“第2部分”,若不启用 numeric,会按字典序排成 “第10节” → “第1章” → “第2部分”。开启后自动识别连续数字并按数值比较:
const list = ['第2章', '第10节', '第1章'];
new Intl.Collator('zh-Hans', { numeric: true }).compare('第10节', '第2章'); // -1(正确:10 > 2)
list.sort(new Intl.Collator('zh-Hans', { numeric: true }).compare); // ['第1章', '第2章', '第10节']
处理多音字与自定义排序权重(进阶)
Intl.Collator 本身不提供多音字上下文分析(如“行”在“银行”读 yínɡ,在“行走”读 xínɡ),但可通过预处理 + collation key 提升准确性:
- 对专业领域词汇(如地名、人名),预先建立多音字映射表,转换为带声调的标准拼音再排序
- 使用 collator.compare() 或 collator.sort() 均可,但注意:sort() 是原地修改,需确保传入的是新数组副本以防污染原始数据
- 性能敏感场景下,可缓存 Collator 实例(locale + options 相同即复用),避免重复初始化开销

















