为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

墨色风雨 2019-06-24 16:23:05
有效地替换字符串中的所有重音字符?对穷人来说近-排序规则-在客户端进行正确的排序-我需要一个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];    }) );}首先,我不喜欢每次调用这个函数时都会重建正则表达式。我想结束在这方面会有帮助,但我似乎没有掌握它的诀窍,出于某种原因。有人能想到更有效率的东西吗?以下答案可分为两类:不同程度的完整性和效率的字符串替换函数(我最初问的是什么)A 迟提的String#localeCompare,它在JS引擎中得到了广泛的支持,能够更优雅地解决这类问题。
查看完整描述

3 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

我无法具体说明您试图对函数本身做些什么,但是如果您不喜欢每次构建正则表达式,这里有两种解决方案和一些关于每种方法的注意事项。

这里有一种方法可以做到这一点:

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]; 
    }) );
  }})();


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 514 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信