Javascript 如何仅调用此函数一次,然后根据需要循环?

Javascript 如何仅调用此函数一次,然后根据需要循环?,javascript,Javascript,我有一个Chrome扩展,可以替换网页上的某些短语。它使用二维数组。[i][1]替换[i][0]值中提供的中的文本 for (var i = 0; i < array.length; i++) { findAndReplaceDOMText(document.body, { preset: 'prose', find: array[i][0], replace: array[i][1] }); } for(变量i=0;i

我有一个Chrome扩展,可以替换网页上的某些短语。它使用二维数组。[i][1]替换[i][0]值中提供的中的文本

for (var i = 0; i < array.length; i++) {
    findAndReplaceDOMText(document.body, {
      preset: 'prose',
      find: array[i][0],
      replace: array[i][1]
    });
}
for(变量i=0;i
这段代码工作正常,但由于它多次调用
findAndReplaceDOMText
函数而不是一次调用,因此计算成本似乎很高。是否可以将for循环移动到函数中,只包装
find
replace
参数?如果是这样,那会是什么样子?我只能得到控制台错误尝试这个


编辑:该函数遍历DOM,查找所有可见的人类可读文本,这些文本包含
find
中提供的正则表达式,并替换为
replace
中提供的字符串。您可以尝试将replace参数用作函数。 然后,
find
-configuration属性需要是由搜索字符串(如
/first | second | third/g
)构造的正则表达式(
RegExp
-object)。不要忘记结尾处的
g
-修饰符


作为
替换-配置属性,您可以创建一个函数来检查出现的字符串(将其作为函数的第二个参数)。根据匹配,然后返回相应的值(例如,如果
match
“first”
,则返回
“1st”
。如果
match
“second”
,则返回
“2nd”
等等)。

如果不修改函数的行为,则无法执行。您可以做的是分离查找和替换过程

您的琴弦以一种难以横向的方式存储,因此让我们将其展平:

var flatFind = array.map(function(elem){
    return elem[0]
})

var flatReplace = array.map(function(elem){
    return elem[1]
})
然后,您需要创建一个包含所有搜索字符串的正则表达式字符串:

var searchString = "/("+flatFind.join("|")+")/g"
然后将其传递给函数,使用函数查找匹配的索引:

findAndReplaceDOMText(document.body, {
    preset: 'prose',
    find: searchString,
    replace: function(portion, match){
      var idx = flatFind.indexOf(match)
      if(idx > -1) return flatReplace[idx]
      else throw "hey, there's no replacement string for this!"
    }
})

这完全取决于函数的功能。使用循环。@SLaks他使用的是正确的,我使用的是findAndReplaceDOMText代码,由@fixmycodet链接。replace参数可以是字符串或函数。你可以利用这一点来做一次而不是n次。感谢这正是我为了安全而寻找的,
array[I][0]
需要一些转义。你是对的,但这要由@rorykoehler来决定,让我们假设这只是一个短语。这很有教育意义。我将此标记为正确答案,因为它比@Matmarbon的答案更详细,虽然基本上是相同的答案。我遗漏了一些括号,而且如果我们已经有一个搜索词的平面列表,为什么不使用它来创建搜索字符串?然后,您可以创建一个函数,将多个搜索字符串映射到一个替换字符串,并使用它来代替只需在搜索和替换之间映射1:1。