2016-08-14 37 views
0

我想將下面的代碼更改爲一個數組,因爲每當我想添加一個新的字符串來替換,我必須寫"roman_ok"+number。如果您需要添加幾百個字符串,這不太方便。有人可以告訴如何去做?更改線性字符串替換操作數組中的javascript

function roman_conversion(format) { 
    var roman_ok = format.replace(/./gm, convert_text); 
    var roman_ok2 = roman_ok.replace(/l%r/g, "ll"); 
    var roman_ok3 = roman_ok2.replace(/l%n/g, "ll"); 
    var roman_ok4 = roman_ok3.replace(/nr/g, "ll"); 
    var roman_ok5 = roman_ok4.replace(/l%y/g, "ry"); 
    var roman_ok6 = roman_ok5.replace(/l%w/g, "rw"); 
    var roman_ok7 = roman_ok6.replace(/kn/g, "ngn"); 
    var roman_ok8 = roman_ok7.replace(/kr/g, "ngn"); 
    var roman_ok9 = roman_ok8.replace(/km/g, "ngm"); 
    var roman_ok10 = roman_ok9.replace(/tn/g, "nn"); 
    var roman_ok11 = roman_ok10.replace(/tr/g, "nn"); 
    var roman_ok12 = roman_ok11.replace(/tm/g, "nm"); 
    var roman_ok13 = roman_ok12.replace(/mr/g, "mn"); 
    var roman_ok14 = roman_ok13.replace(/pn/g, "mn"); 
    var roman_ok15 = roman_ok14.replace(/pr/g, "mn"); 
    var roman_ok16 = roman_ok15.replace(/pm/g, "mm"); 
    var roman_ok17 = roman_ok16.replace(/ngr/g, "ngn"); 
    return roman_ok17; 
+0

'convert_text'從哪裏來? – Tibrogargan

+0

這是我沒有在這個消息中引用的函數(我認爲這不應該是重要的)。這是第一次將單個字符轉換爲我想要替換的那些 – user2911849

+0

獲得了一些測試數據? – Tibrogargan

回答

0

對我而言,最簡單的答案就是評論中的Trincot:

請注意,您不必使用這些中間變量。你可以只鏈取代電話:

return format.replace(/aa/, 'bb').replace(/cc/, 'dd').replace ............ ; 

注意也是更換可能會產生一些再次通過如下替換的一個替代。知道確切的案例將有助於確定更好的方法來解決這個問題。
- trincot 8月14日6:50

1

您可以使用reduce此:

var replacements = [[/foo/, 'bar'], [/baz/, 'quux'], ...]; 
function roman_conversion(format) { 
    return replacements.reduce((prev, curr) => prev.replace(curr[0], curr[1]), format); 
} 

編輯:使用ES6箭頭函數的語法在這裏,隨時與function(prev, curr) { ... }

0

更換這可能是你想要的

function Replacement(pattern, replacement) { 
    this.pattern = pattern; 
    this.replacement = replacement; 
} 

var replacements = [ 
    // new Replacement(new RegExp('.', 'gm'), convert_text), 
    new Replacement(new RegExp("l%r", "g"), "ll"), 
    new Replacement(new RegExp("l%n", "g"), "ll"), 
    new Replacement(new RegExp("nr", "g"), "ll"), 
    new Replacement(new RegExp("l%y", "g"), "ry"), 
    new Replacement(new RegExp("l%w", "g"), "rw"), 
    new Replacement(new RegExp("kn", "g"), "ngn"), 
    new Replacement(new RegExp("kr", "g"), "ngn"), 
    new Replacement(new RegExp("km", "g"), "ngm"), 
    new Replacement(new RegExp("tn", "g"), "nn"), 
    new Replacement(new RegExp("tr", "g"), "nn"), 
    new Replacement(new RegExp("tm", "g"), "nm"), 
    new Replacement(new RegExp("mr", "g"), "mn"), 
    new Replacement(new RegExp("pn", "g"), "mn"), 
    new Replacement(new RegExp("pr", "g"), "mn"), 
    new Replacement(new RegExp("pm", "g"), "mm"), 
    new Replacement(new RegExp("ngr", "g"), "ngn"), 
]; 

function roman_conversion(string) { 
    return replacements.reduce(
     function(previous, current) { 
      return previous.replace(current.pattern, current.replacement); 
     }, string); 
}