最近,我写了一些代码来过滤字符串中的坏词。而且会有大量的词语被过滤掉。我的代码有效,但性能并不如预期的那么好。
下面的代码只是演示:
方法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比替换更快。但是当替换大字符串时它会很慢。 (我注意到结果有时会改变)
我真正想要的是什么
我实际上需要一个稳定的功能来替换具有更好性能的单词。有什么建议吗?它可以是另一种不使用替换或拆分的方法。加入。非常感谢
答案 0 :(得分:3)
使用单个正则表达式替换一个调用中的所有目标:
smallString = smallString.replace(/omg|bbq|wth|hello|world/g, "***");
如果必须将目标保持为数组,请立即将其转换为正则表达式:
smallString = smallString.replace(new RegExp(list.join("|"), "g"), "***");