我怎样才能只调用这个函数一次,并根据需要循环
How can I call this function only once yet loop as needed?
我有一个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循环,只是包装find
和replace
参数?如果是这样,那会是什么样子呢?我只能得到控制台错误。
编辑:该函数遍历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"
,依此类推)。
相关文章:
- Javascript返回值只在循环中返回一次
- For循环在Jquery中只运行一次
- 可能只在for循环内部运行一次代码块
- mongoose.js Model.remove在循环中只能工作一次
- 循环遍历数组并仅获取一次相同的值
- Jquery 循环一次或在数据数组中显示一次数据
- 一次循环遍历一组
- 如何在if循环中只执行一次
- AJAX在数组循环中调用,只在上一次完成后调用next
- 正在加载“"循环,每3秒更改一次文本
- 我怎么能有一个实时计时器,在3秒的循环内每秒钟更新一次
- 在Javascript中每五秒钟循环一次
- 如何一次运行一次循环javascript
- 使用胡须.js一次循环访问一个测验项目
- 递归 JS 函数每秒错过一次循环
- 使用 javascript 一次循环播放 4 个以上的声音
- 为什么我的循环只有一次循环,即使有3个项目
- 在下一次循环迭代之前等待promise结果
- Jquery 一次循环和绑定 10 条记录
- JavaScript在同一循环中每x次迭代一次循环