如何更好地组织JavaScript中的连续替换方法?

时间:2011-12-18 08:50:04

标签: javascript replace mootools

我有一系列替换方法,包括正则表达式。他们都像这样放在一起:

motivation = motivation.replace('death','life').replace('sad','happy').replace(/fu+ck/gi,'yay!').replace('darkness','light');

有没有办法组织这个更具可读性?不必一直重复“替换”将是一个良好的开端。我也可以访问Mootools库。

3 个答案:

答案 0 :(得分:2)

这是我能想到的最简单的事情:聪明的缩进。

motivation = motivation.replace('death','life')
   .replace('sad','happy')
   .replace(/fu+ck/gi,'yay!')
   .replace('darkness','light');

另一种选择就是使用类似Array.each的东西(我认为这是在Mootools中):

Array.each([['death', 'life'],['sad', 'happy'],[/fu+ck/gi, 'yay!'],
            ['darkness', 'light']],
    function (pair) { motivation = motivation.replace(pair[0], pair[1]); });

这对于很长的替换列表才有意义。

答案 1 :(得分:1)

您可以添加换行符。

motivation = motivation
             .replace('death','life')
             .replace('sad','happy')
             .replace(/fu+ck/gi,'yay!')
             .replace('darkness','light');

除此之外 - 除非你改变整个方法 - 不,我不知道如何改进它。

改变方法可能意味着:

function replaceMany(s /*, [search, replace], ... */) {
  for (var i=1, l=arguments.length; i<l; i++) {
    s = s.replace(arguments[i][0], arguments[i][1]); 
  }
  return s;
}

然后你可以把它称为:

var motivation = replaceMany(
  motivation, 
  ['death','life'], ['sad','happy'], [/fu+ck/gi,'yay!'], ['darkness','light']
);

将它包装在函数中的优势显然是您可以在不更改源代码的情况下更改正在替换的内容。因此,除非你有一套固定的,有限的替代品永远不会改变,后一种方法是更好的。

答案 2 :(得分:0)

我发现原始版本不可读,尤其是如果您按其他答案的建议添加一些换行符。所以我会完全做到Tomalak和Tikhon所说的。

但是如果你真的想避免一直重复.replace,你可以创建一个包含查找/替换文本数组的函数:

function replaceMany(str, replacements) {
   for (var i=0; i<replacements.length; i+++)
      str = str.replace(replacements[i][0], replacements[i][1]);
   return str;
}

motivation = replaceMany(motivation, [ ['death','life'],
                                       ['sad','happy'],
                                       [/fu+ck/gi,'yay!'],
                                       ['darkness','light'] ]);

显然,我已选择将replacements参数设为一个数组,其中每个元素都是一个双元素数组,其中包含要查找的文本(或正则表达式)以及相应的替换文本。

我真的不建议搞乱内置的对象原型,但如果你是那样的话:

String.prototype.replaceMany = function(replacements) {
   var str = this;
   for (var i=0; i<replacements.length; i+++)
      str = str.replace(replacements[i][0], replacements[i][1]);
   return str;
}

motivations = motivations.replaceMany([/*array as above*/]);