我怎样才能只调用这个函数一次,并根据需要循环

How can I call this function only once yet loop as needed?

本文关键字:一次 循环 调用 函数      更新时间:2023-09-26

我有一个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]
    });
}

这段代码工作得很好,但它似乎在计算上很昂贵,因为它多次调用findAndReplaceDOMText函数而不是一次。是否有可能在函数内移动for循环,只是包装findreplace参数?如果是这样,那会是什么样子呢?我只能得到控制台错误。

编辑:该函数遍历DOM,查找包含find提供的正则表达式短语的所有可见的人类可读文本,并替换为replace提供的字符串。

如果不修改函数的行为,就不能。可以做的是将查找和替换传递分开。

您的字符串以一种难以横向存储的方式存储,因此让我们将它们平展:

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!"
    }
})

您可以尝试将replace参数用作函数。然后,find -configuration-property需要是由搜索字符串(如/first|second|third/g)构造的正则表达式(RegExp -object)。不要忘记最后的g -修饰符。

作为replace -configuration-property,然后创建一个函数来检查哪个字符串发生了(您将其作为函数的第二个参数)。然后根据匹配返回相应的值(例如,如果match"first",则返回"1st")。如果match"second",则返回"2nd",依此类推)。