Javascript 如何仅调用此函数一次,然后根据需要循环?
我有一个Chrome扩展,可以替换网页上的某些短语。它使用二维数组。[i][1]替换[i][0]值中提供的中的文本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
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。