我有一个chrome扩展内容脚本,该脚本尝试使用html节点中的textcontent
来匹配对象数组中的字符串。如果存在匹配项,扩展名将用新的html替换包含该匹配项的html。
我在匹配方面遇到问题。包含字符串的数组由2367个对象组成,每个对象都包含一个name属性。
我实现了TreeWalker来将要解析的节点范围缩小到仅包含带有文字的文本的节点。
基本上,我正在尝试查找包含字符串匹配项的节点的交集。但是,我针对该问题采取的每种方法都会导致执行时间花费5分钟或更长时间和/或CPU瓶颈。我希望你们能够指出我做错了什么,或者将我发送给其他人。预先感谢!
到目前为止,我所有寻找匹配项的尝试都包括RegEx的一些实现。 replace()
似乎是最费力的,但是test()
并没有带来太多改善。
为了遍历节点数组和字符串对象数组,我尝试了for..of
循环,for
循环,带有嵌套forEach()
的{{1}}和forEach()
和嵌套的filter()
。
这是内容脚本的简单版本。
some()
这是const test = (players) => {
let body = document.body;
let bodyCopy = body.cloneNode(true)
let treeWalker = document.createTreeWalker(
bodyCopy,
NodeFilter.SHOW_TEXT,
node => {
let regex = /\w+/gi
if (regex.test(node.textContent)) {
return NodeFilter.FILTER_ACCEPT;
} else {
return NodeFilter.FILTER_SKIP;
}
}
);
let nodes = [];
while (treeWalker.nextNode()) {
nodes.push(treeWalker.currentNode);
}
const intersection = (_players, _nodes) => {
let matchedPlayers = [];
matchedPlayers = _players.filter(player => {
return _nodes.some((node) => {
let re = new RegExp(player.name.full, 'i')
return re.test(node.textContent)
})
})
console.log (matchedPlayers);
}
return intersection(players, nodes)
}
chrome.runtime.onMessage.addListener(
function (request, sender, sendResponse) {
if (request.message === "test") {
console.log(request.players)
test(request.players)
sendResponse({ gotIt: "Got it!" })
}
}
)
数组中的对象的样子
request.players