JavaScript: рефакторинг циклического регулярного выражения - PullRequest
1 голос
/ 12 февраля 2010

Как это можно улучшить, поскольку оно относится к циклу и замене регулярного выражения?

var properties = { ... };
var template = element.innerHTML;

for (var name in properties) {
    template = template.replace
        (new RegExp('\\${' + name + '}', 'gm'), properties[name]);
}

element.innerHTML = template;

Есть ли способ получить все совпадения для /\$\{\w+\}/gm и просто использовать их для создания новой строки один раз для всей операции?

Ответы [ 3 ]

3 голосов
/ 12 февраля 2010

Я согласен с Джейсоном и Хансом WRT, которые не беспокоятся об этом с точки зрения производительности.

Но я бы написал это иначе:

element.innerHTML
  = template.replace(/[$][{](\w+)[}]/g, function(x,y){return properties[y]||x;})

Некоторые вещи, которые нужно иметь в виду

  1. Если это вообще возможно, вы хотите избежать циклического создания RegExp для каждой итерации. Составление их, как правило, считается дорогостоящим. Или даже обобщить это на любое создание объекта. Хотя не за счет читаемости / ремонтопригодности.
  2. Если вы создаете RegExp динамически, убедитесь, что результатом является RegExp, в противном случае см. № 1, поскольку вы, вероятно, сможете его применить.
1 голос
/ 12 февраля 2010

Я укушу; -)

var properties = { ... };
var template = element.innerHTML;
element.innerHTML = template.replace (
    RegExp ('\\$\\{(' + getTags (properties).join ('|') +')\\}'),
    function (m0, tag) {return properties[tag];});

function getTags (obj) {
  var tags = [];
  for (var t in obj)
    hasOwnProperty (t) && tags.push (t);
  return tags;
}

По-прежнему просматривает теги свойств (при вызове getTags), но создает только один объект регулярного выражения и сканирует шаблон только один раз.

Обратите внимание, что имена тегов в свойствах не должны содержать специальных символов регулярных выражений (например, или (и т. Д.).

Я бы согласился с Джейсоном, хотя, вероятно, не стоит усилий, если нет большого количества тегов или шаблон очень большой.

0 голосов
/ 12 февраля 2010

Неэффективно, как кажется, я не думаю, что вы будете делать намного лучше, чем это. Пока вы не заменяете более нескольких десятков токенов, я был бы удивлен, если бы это было на самом деле узким местом.

Если ваш профилировщик не определил это как узкое место, я бы определенно не стал тратить время на его переписывание. Если ничего другого, это намного более читабельно, чем ваша другая идея, и, в конце концов, это, вероятно, так же быстро.

...