如何用更好的性能替换字符串中的大量单词?

Dic*_*han 6 javascript performance

最近,我写了一些代码来过滤字符串中的坏词.而且会有大量的词语被过滤掉.我的代码有效,但性能并不如预期的那么好.

下面的代码只是演示:

方法1:

let list = [ "omg", "bbq", "wth", "hello", "world" ];
let smallString = "wthhello123456worldomg789bbqomgomg";
for (let i = 0; i < list.length; i++) {
  smallString = smallString.replace(new RegExp(list[i], "g"), "***");
}
Run Code Online (Sandbox Code Playgroud)

方法2:

let list = [ "omg", "bbq", "wth", "hello", "world" ];
let smallString = "wthhello123456worldomg789bbqomgomg";
for (let i = 0; i < list.length; i++) {
  smallString = smallString.split(list[i]).join("***");
}
Run Code Online (Sandbox Code Playgroud)

我还使用jsperf进行性能测试,与split和join或replace进行比较:https://jsperf.com/split-join-vs-replace-dicky

测试结果表明,在更换小字符串时,拆分和连接比替换更快.但是当替换大字符串时它会很慢.(我注意到结果有时会改变)

我真正想要的是什么

我实际上需要一个稳定的功能来更换性能更好的单词.有什么建议吗?它可以是不使用替换或拆分和连接的另一种方法.非常感谢

Boh*_*ian 4

使用单个正则表达式替换一次调用中的所有目标:

smallString = smallString.replace(/omg|bbq|wth|hello|world/g, "***");
Run Code Online (Sandbox Code Playgroud)

如果您必须将目标保留为数组,请将其即时转换为正则表达式:

smallString = smallString.replace(new RegExp(list.join("|"), "g"), "***");
Run Code Online (Sandbox Code Playgroud)