代码之家  ›  专栏  ›  技术社区  ›  Ann MB

用字典优化文本替换性能

  •  0
  • Ann MB  · 技术社区  · 5 年前

    我正在为火狐开发一个扩展。

    总结一下,假设它是一个应用于有很多错误的页面的拼写检查器。

    但是太慢了,因为台阶太多了。

    我创建了一个TreeWalker,它只过滤空文本节点

    var tree = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, {
      acceptNode: function(node) {
        if (node.parentNode.nodeName !== "SCRIPT" && node.nodeValue.trim().length > 0) {
          return NodeFilter.FILTER_ACCEPT;
        }
      }
    }, false);
    

    (二) 一个小圈子掠过了树人

    (三) RegEx

    const dico = [
      ['suffix1','suffix2','correction'],
      ['','',''],
      ['','',''],
      // a lot of lines
    ];
    

    (四) 文本被替换

    dl = dico.length;
    
    function skim(){
      while (tree.nextNode()) {
        for (var i=0; i < dl ; i++) {
          var r1 = new RegExp("([a-zÀ-ÖÙ-öù-üœŒ]+)?(" + dico[i][0] + ")[-/·∙.•](" + dico[i][1] + ")[-/·∙.•]?(s)?(?![a-z])", "gi");
          tree.currentNode.nodeValue = tree.currentNode.nodeValue.replace(r1, dico[i][3]);
        }
      }
    }
    

    我该怎么优化呢?:)

    目前,我找到的唯一解决办法是简化字典,但我以这个结束了。并替换 TreeWalker

    谢谢!

    0 回复  |  直到 5 年前
        1
  •  0
  •   Jonas Wilms    5 年前

    这是KostasX和Jonas Wilms的提议的更新。

    这要快得多,因为它会记住regex,这样就不必在每个节点上重新创建它们。

    此外,它还异步迭代,以不阻塞UI。

    function skim() {
      dicomap.map((replace_entry)=>{
        tree.currentNode.nodeValue = tree.currentNode.nodeValue.replace(replace_entry[0],replace_entry[mode]);
      });
    
      if(tree.nextNode()) setTimeout(skim);
    }
    skim();