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

时间:2018-06-14 11:49:02

标签: 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"), "***");
}

方法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("***");
}

我还用jsperf进行了性能测试,与split&amp; amp;加入或替换: https://jsperf.com/split-join-vs-replace-dicky

测试结果显示分裂&amp;在替换小字符串时,join比替换更快。但是当替换大字符串时它会很慢。 (我注意到结果有时会改变)

我真正想要的是什么

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

1 个答案:

答案 0 :(得分:3)

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

smallString = smallString.replace(/omg|bbq|wth|hello|world/g, "***");

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

smallString = smallString.replace(new RegExp(list.join("|"), "g"), "***");