将javascript中的线性字符串替换操作更改为数组

Change linear string replace operations to array in javascript

本文关键字:操作 数组 替换 字符串 javascript 线性      更新时间:2023-09-26

我想将以下代码更改为数组,因为每当我想添加要替换的新字符串时,我必须编写"roman_ok"+number。如果你有几百个字符串要添加,这就不方便了。有人能告诉我怎么做吗?

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;

您可以使用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) { ... }

这可能是你想要的

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

对我来说最简单的答案是评论里的Trincot:

请注意,您不必使用这些中间变量。您可以直接链接replace调用:

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

还要注意,替换可能会产生再次被以下替换之一所替换的东西。了解确切的情况可能有助于找到更好的方法来解决这个问题。
——trincot Aug 14 at 6:50