亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

墨色風雨 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 關注
  • 526 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號