排列含音节字母的字符串
Javascript有一个原生方法sort可以排列数组。一次简单的array.sort()
将每一个数组元素视为字符串并按照字母表排列。你也可以提供自定义排列方法。
['Shanghai', 'New York', 'Mumbai', 'Buenos Aires'].sort();
// ["Buenos Aires", "Mumbai", "New York", "Shanghai"]
但是当你试图整理一个如['é', 'a', 'ú', 'c']
这样的非ASCII元素的数组时,你可能会得到一个奇怪的结果['c', 'e', 'á', 'ú']
。这是因为排序方法只在英文下有用。
看一下下一个例子:
// 西班牙语
['único','árbol', 'cosas', 'fútbol'].sort();
// ["cosas", "fútbol", "árbol", "único"] // bad order
// 德语
['Woche', 'wöchentlich', 'wäre', 'Wann'].sort();
// ["Wann", "Woche", "wäre", "wöchentlich"] // bad order
幸运的是,有两种方法可以解决这个问题,由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"]
使用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"]
- 两个方法都可以自定义区域位置。
- 根据Firefox,当比较大数量的字符串时,使用
Intl.Collator
更快。
所以当你处理一个由非英语组成的字符串数组时,记得使用此方法来避免排序出现意外。
MEET THE NEW JSTIPS BOOK
You no longer need 10+ years of experience to get your dream job.
Use the 100 answers in this short book to boost your confidence and skills to ace the interviews at your favorite companies like Twitter, Google and Netflix.
GET THE BOOK NOW
MEET THE NEW JSTIPS BOOK
The book to ace the JavaScript Interview.
A short book with 100 answers designed to boost your knowledge and help you ace the technical interview within a few days.
GET THE BOOK NOW