Javascript 循环遍历大字典会产生无响应的脚本

标签 javascript dictionary firefox-addon

我正在制作一个 Firefox 插件,它将单词与 html 文本中的其他单词附加在一起。这段代码可以工作,但是当迭代一个巨大的字典时,我收到一个无响应的脚本错误。

提高此循环速度的最佳方法是什么?

将字典分割成更小的对象?或者设置timeout function

var brands = {"manykeys" : "manyvalues"};

function replaceWord(){
    for (var key in brands){
        htmlreplace(key, key + " (" + brands[key] + ")");
    }
}
function htmlreplace(a, b, element) {    
    if (!element) element = document.body;    
    var nodes = element.childNodes;
    for (var n=0; n<nodes.length; n++) {
        if (nodes[n].nodeType == Node.TEXT_NODE) {
            var r = new RegExp(a, 'g');
            nodes[n].textContent = nodes[n].textContent.replace(r, b);
        } else {
            htmlreplace(a, b, nodes[n]);
        }
    }
}

replaceWord();

最佳答案

需要考虑一些因素。这在很大程度上取决于你可以改变什么或不能改变什么。您可以做的更大的改进之一是使用数组而不是键/值对象。

var brands = [
['manykeys0000','manyvalues0000'],
['manykeys0001','manyvalues0001'],
['manykeys0002','manyvalues0002'],
['manykeys0003','manyvalues0003'],
['manykeys0004', ...
];

function replaceWord(){
    var i, n = brands.length;
    for (i = 0; i < n; ++i) {
        htmlreplace(brands[i][0], brands[i][0] + " (" + brands[i][1] + ")");
    }
}

其他一些更改也应该会带来微小的改进:

1.) 将nodes.length移到循环之外。
2.) 如果合适的话,从 replaceWord()

传递 document.body
var body = document.body;

...
    htmlreplace(brands[i][0], brands[i][0] + " (" + brands[i][2] + ")", body);

function htmlreplace(a, b, element) {    
    var nodes = element.childNodes, len = nodes.length;
    for (var n=0; n < len; ++n) {

Chrome 和 Firefox 上的综合快速基准测试使速度提高了 30-40%。

<小时/>

其他要测试的编辑:

var r = new RegExp(a, 'g'); 移至 replaceWord(),并将其作为第一个参数传递给 htmlreplace() 而不是 a

function replaceWord(){
    var i, n = brands.length;
    for (i = 0; i < n; ++i) {
        var r = new RegExp(brands[i][0], 'g');
        htmlreplace(r, brands[i].join(' (') + ')', elem);
    }
}
<小时/>

如果玩超时this article可能会感兴趣。它使用

window.postMessage();

实现自定义setZeroTimeout(),但不确定它将如何影响您的案例。

旁边JSPerf等。在浏览器中使用分析工具,例如 in Chrome ,这可能更适合您在代码中所做的事情。

关于Javascript 循环遍历大字典会产生无响应的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22600308/

相关文章:

python - 在 python 2.7 中更快地从大列表中搜索 ID?

php - Javascript 在 Firefox 插件中通过 POST 发送数据

Firefox 扩展 API -permissions.request 只能从用户输入处理程序调用?

javascript 开关(真)

php - FCKeditor 留下了很多打开的标签 - 如何删除它们

javascript - JS 函数可以与 2 个不同的调用一起使用。

java - 我可以获取 map 的一部分并测试我使用的 key 吗?

javascript - 可选参数 'fall through' 如何在 Javascript 中发挥作用

java - 将映射键与某些元素进行比较,并根据结果显示其值

java - Firefox port.emit 和 port.on 在扩展中不起作用