JavaScript 中的带重音字符的字符串排序

Posted by cl9000 on May 27, 2020

在事情成功之前,一切总看似不可能。——<纳尔逊·曼德拉>

基本

Javascript 具有自带方法排序功能,可以对数组进行排序。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
array.sort()会将每个数组项视为一个字符串,并按字母顺序对其进行排序。您也可以提供自己的自定义排序功能。

1
2
3
4
5
6
7
8
9
10
11
12
['Shanghai', 'New York', 'Mumbai', 'Buenos Aires'].sort();
// ["Buenos Aires", "Mumbai", "New York", "Shanghai"]

const months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// expected output: Array ["Dec", "Feb", "Jan", "March"]

const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);
// expected output: Array [1, 100000, 21, 30, 4]

特殊

但是,当您尝试处理像这样的非ASCII字符数组时['é', 'a', 'ú', 'c']
您会得到一个奇怪的结果['c', 'e', 'á', 'ú']。发生这种情况是因为sort仅适用于英语。

请参见下一个示例:

1
2
3
4
5
6
7
// 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

幸运的是,有两种方法可以克服 ECMAScript Internationalization API提供的 localeCompareIntl.Collat​​or 行为。

两种方法都有自己的自定义参数,以便对其进行配置以使其正常工作。

使用 localeCompare()

1
2
3
4
5
6
7
8
9
['ú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"]

使用 Intl.Collator()

1
2
3
4
5
['ú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"]
  • 对于每种方法,您可以自定义位置。
  • 根据Firefox,在比较大量字符串时,Intl.Collat​​or的速度更快。

参考

关注【公众号】,了解更多。*



支付宝打赏 微信打赏

赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!