猿问

有效地替换字符串中的所有重音字符?

有效地替换字符串中的所有重音字符?

对穷人来说-排序规则-在客户端进行正确的排序-我需要一个JavaScript函数高效率字符串中的单个字符替换。

这就是我的意思(请注意,这适用于德语文本,其他语言排序不同):

native sorting gets it wrong: a b c o u z ä ö ü
collation-correct would be:   a ä b c o ö u ü z

基本上,我需要将给定字符串的所有“a”替换为“a”(以此类推)。这样,本机排序的结果将非常接近用户预期的结果(或数据库返回的内容)。

其他语言也有这样做的便利:Python用品str.translate(),在Perl有tr/…/…/XPath有一个函数translate()ColdFusionReplaceList()..但是JavaScript呢?

这是我现在所拥有的。

// s would be a rather short string (something like // 200 characters at max, most of the time much less)function makeSortString(s) {
  var translate = {
    "ä": "a", "ö": "o", "ü": "u",
    "Ä": "A", "Ö": "O", "Ü": "U"   // probably more to come
  };
  var translate_re = /[öäüÖÄÜ]/g;
  return ( s.replace(translate_re, function(match) { 
    return translate[match]; 
  }) );}

首先,我不喜欢每次调用这个函数时都会重建正则表达式。我想结束在这方面会有帮助,但我似乎没有掌握它的诀窍,出于某种原因。

有人能想到更有效率的东西吗?


以下答案可分为两类:

  1. 不同程度的完整性和效率的字符串替换函数(我最初问的是什么)
  2. 迟提

    String#localeCompare

    ,它在JS引擎中得到了广泛的支持,能够更优雅地解决这类问题。


墨色风雨
浏览 515回答 3
3回答

料青山看我应如是

我无法具体说明您试图对函数本身做些什么,但是如果您不喜欢每次构建正则表达式,这里有两种解决方案和一些关于每种方法的注意事项。这里有一种方法可以做到这一点:function makeSortString(s) {   if(!makeSortString.translate_re) makeSortString.translate_re = /[öäüÖÄÜ]/g;   var translate = {     "ä": "a", "ö": "o", "ü": "u",     "Ä": "A", "Ö": "O", "Ü": "U"   // probably more to come   };   return ( s.replace(makeSortString.translate_re, function(match) {      return translate[match];    }) );}这显然会使regex成为函数本身的属性。您可能不喜欢这个(或者您可能不喜欢,我猜这取决于)的唯一一点是,regex现在可以在函数的主体之外进行修改。因此,有人可以这样做来修改互用的regex:makeSortString.translate_re = /[a-z]/g;所以,有这样的选择。获得闭包从而防止某人修改regex的一种方法是将其定义为这样的匿名函数赋值:var makeSortString = (function() {   var translate_re = /[öäüÖÄÜ]/g;   return function(s) {     var translate = {       "ä": "a", "ö": "o", "ü": "u",       "Ä": "A", "Ö": "O", "Ü": "U"   // probably more to come     };     return ( s.replace(translate_re, function(match) {        return translate[match];      }) );   }})();希望这对你有用。更新:现在还早,我不知道为什么我以前没有看到明显的,但它也可能是有用的,让你translate对象也包含在闭包中:var makeSortString = (function() {   var translate_re = /[öäüÖÄÜ]/g;   var translate = {     "ä": "a", "ö": "o", "ü": "u",     "Ä": "A", "Ö": "O", "Ü": "U"   // probably more to come   };   return function(s) {     return ( s.replace(translate_re, function(match) {        return translate[match];      }) );   }})();
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答