在Javascript(Æ)中排序特殊字符

don*_*tic 5 javascript sorting special-characters node.js

我正在尝试根据对象的name属性对对象数组进行排序.有些名字以'Æ'开头,我希望它们被排序好像是'Ae'.我目前的解决方案如下:

myArray.sort(function(a, b) {
  var aName = a.name.replace(/Æ/gi, 'Ae'),
      bName = b.name.replace(/Æ/gi, 'Ae');
  return aName.localeCompare(bName);
});
Run Code Online (Sandbox Code Playgroud)

我觉得应该有一个更好的方法来处理它,而不必手动替换每个特殊字符.这可能吗?

我在Node.js中这样做,如果它有任何区别.

Juk*_*ela 5

没有更简单的方法.不幸的是,即使问题中描述的方式太简单了,至少如果可移植性有任何问题.

localeCompare方法依赖于实现,并且通常取决于底层操作系统的UI语言,尽管它在同一计算机中的浏览器(或其他JavaScript实现)之间也可能不同.可能很难找到任何文档,因此即使您的目标是编写非可移植代码,您也可能需要进行大量测试以查看应用了哪种归类顺序.参看 对字符串进行排序是比你想象的要困难得多!

因此,为了进行可控且便携的比较,您需要自己编写代码,除非您足够幸运地找到符合您需求的其他代码.从积极的方面来说,案例转换方法是本地化准备的JavaScript的少数几个部分之一:它们应用Unicode案例映射规则,因此例如'æ'.toUpperCase()在任何实现中产生Æ.

通常,排序字符串需要复杂的功能,该功能应用为语言定义的特定排序规则或某些其他规则,例如泛欧排序规则(用于多语言内容).但是,如果我们可以限制自己除了Ascii之外只处理少数几个字母的排序规则,我们可以使用类似下面的简化德语排序的代码(摘自使用JavaScript和Globalize.js的Going Global):

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;
}
Run Code Online (Sandbox Code Playgroud)

replace(/Æ/gi, 'Ae')在分析可能出现的字符并决定如何处理它们之后,您可以添加其他映射,例如.删除变音符号(例如映射É到E)简单但通常足够好,并且肯定比将其留给实现来决定是否在Z之后的某个地方更好.并且至少你会在实现中得到一致的结果,你会看到什么事情出错了,需要修复,而不是等待其他用户抱怨你的代码排序错误(在他们的环境中).