Javascript 有一个允许对数组进行排序的本机方法sort 。执行简单array.sort()
操作会将每个数组条目视为字符串并按字母顺序对其进行排序。您也可以提供自己的自定义排序功能。
['Shanghai', 'New York', 'Mumbai', 'Buenos Aires'].sort();
// ["Buenos Aires", "Mumbai", "New York", "Shanghai"]
但是当你尝试像这样对一个非 ASCII 字符数组进行排序时['é', 'a', 'ú', 'c']
,你会得到一个奇怪的结果['c', 'e', 'á', 'ú']
。发生这种情况是因为 sort 仅适用于英语。
请参见下一个示例:
// Spanish
['único','árbol', 'cosas', 'fútbol'].sort();
// ["cosas", "fútbol", "árbol", "único"] // bad order
// German
['Woche', 'wöchentlich', 'wäre', 'Wann'].sort();
// ["Wann", "Woche", "wäre", "wöchentlich"] // bad order
//中文
['张','王','李'].sort();
//['张', '李', '王'] //按拼音顺序应为李、王、张
幸运的是, ECMAScript 国际化 API 提供了两种方法来克服这种行为localeCompare和Intl.Collator 。
这两种方法都有自己的自定义参数,以便将其配置为充分工作。
使用localeCompare()
['único','árbol', 'cosas', 'fútbol'].sort(function (a, b) {
return a.localeCompare(b);
});
// ["árbol", "cosas", "fútbol", "único"]
['Woche', 'wöchentlich', 'wäre', 'Wann'].sort(function (a, b) {
return a.localeCompare(b);
});
// ["Wann", "wäre", "Woche", "wöchentlich"]
['张','王','李'].sort(function (a, b) {
return a.localeCompare(b);});
// ['李', '王', '张']
使用Intl.Collator()
['único','árbol', 'cosas', 'fútbol'].sort(Intl.Collator().compare);
// ["árbol", "cosas", "fútbol", "único"]
['Woche', 'wöchentlich', 'wäre', 'Wann'].sort(Intl.Collator().compare);
// ["Wann", "wäre", "Woche", "wöchentlich"]
['张','王','李'].sort(Intl.Collator().compare);
// ['李', '王', '张']
- 对于每种方法,您都可以自定义位置。
- 根据Firefox Intl.Collator 在比较大量字符串时更快。
因此,当您使用非英语语言的字符串数组时,请记住使用此方法以避免意外排序。