我正在尝试根据对象的 name
属性对对象数组进行排序。有些名称以“Æ”开头,我希望将它们按“Ae”排序。我目前的解决方案如下:
myArray.sort(function(a, b) {
var aName = a.name.replace(/Æ/gi, 'Ae'),
bName = b.name.replace(/Æ/gi, 'Ae');
return aName.localeCompare(bName);
});
我觉得应该有更好的方法来处理这个问题,而不必手动替换每个特殊字符。这可能吗?
如果有任何不同,我会在 Node.js 中执行此操作。
最佳答案
没有更简单的方法。不幸的是,即使是问题中描述的方式也太简单了,至少在可移植性有任何问题的情况下。
localeCompare
方法在定义上是依赖于实现的,它通常依赖于底层操作系统的 UI 语言,尽管在相同的浏览器(或其他 JavaScript 实现)之间它也可能不同电脑。很难找到关于它的任何文档,因此即使您的目标是编写不可移植的代码,您也可能需要进行大量测试以查看应用了哪种整理顺序。比照。至 Sorting strings is much harder than you thought!
因此,要进行可控且可移植的比较,您需要自己编写代码,除非您有幸找到恰好适合您需求的其他人的代码。从积极的方面来看,大小写转换方法是 JavaScript 中为数不多的本地化就绪部分之一:它们应用 Unicode 大小写映射规则,例如'æ'.toUpperCase()
在任何实现中都会产生 Æ。
一般来说,对字符串进行排序需要一个复杂的函数来应用为一种语言定义的特定排序规则或一些其他规则,例如泛欧排序规则(用于多语言内容)。但是,如果我们可以将自己限制在仅处理 Ascii 之外的少数字母的排序规则,我们可以使用类似以下代码的德语简化排序(摘自书籍 Going Global with JavaScript and Globalize.js):
String.prototype.removeUmlauts = function () {
return this.replace(/Ä/g,'A').replace(/Ö/g,'O').replace(/Ü/g,'U');
};
function alphabetic(str1, str2) {
var a = str1.toUpperCase().removeUmlauts();
var b = str2.toUpperCase().removeUmlauts();
return a < b ? -1 : a > b ? 1 : 0;
}
在分析可能出现的字符并决定如何处理它们之后,您可以向其中添加其他映射,例如 replace(/Æ/gi, 'Ae')
。删除变音符号(例如,将 É 映射到 E)很简单,但通常已经足够好了,而且肯定比将其留给实现来决定 É 是否在 Z 之后的某个地方要好。至少你会在不同的实现中得到一致的结果,你会看到什么事情出了问题需要修复,而不是等待其他用户提示您的代码排序全错(在他们的环境中)。
关于javascript - 在 Javascript 中对特殊字符进行排序 (Æ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12342839/