有没有办法避免这段代码中的嵌套循环?

问题描述

我正在构建一个 chrome 扩展,让用户可以用小图像替换文字。这是我的代码

lookup=[['text','img.png']...];
var text = document.querySelectorAll('h1,h2,h3,h4,h5,p,li,td,caption,span,a')

for (let i=0; i< text.length; i++) {
    var height = window.getComputedStyle(text[i]).fontSize
    for (let j=0;j<lookup.length;j++){
        text[i].innerHTML = text[i].innerHTML.replace(new RegExp(lookup[j][0],"gi"),"<img src=\"img/"+lookup[j][1]+"\" width=\""+height+"\" height=\""+height+"\">");
    }
}

由于每次页面中的任何文本更改时都必须运行此代码,因此我担心嵌套循环可能会导致严重的性能下降。 javascript 中有什么可以避免的吗?

解决方法

您可以创建一个对象查找并创建一个带有交替 | 的正则表达式。在replace中使用一个函数作为第二个参数,并使用lookup对象根据匹配获取图像

const lookup= { 'text': 'img.png' },elements = document.querySelectorAll('h1,h2,h3,h4,h5,p,li,td,caption,span,a'),regex = new RegExp(Object.keys(lookup).join("|"),'gi')

elements.forEach(e => {
  const height = window.getComputedStyle(e).fontSize;
  e.innerHTML = e.innerHTML.replace(regex,m => `<img src="img/${lookup[m]}" width="${height}" />`)
})