Одна проблема:
Я хочу обработать строку (str
), чтобы любые скобки (совпадающие с rgx
) заменялись значениями, взятыми из соответствующего места в массиве (sub
):
var rgx = /\((\d+)\)/,
str = "this (0) a (1) sentence",
sub = [
"is",
"test"
],
result;
result
, учитывая указанные выше переменные, должен быть "это тестовое предложение".
Два решения:
var mch,
parsed = '',
remainder = str;
while (mch = rgx.exec(remainder)) { // Not JSLint approved.
parsed += remainder.substring(0, mch.index) + sub[mch[1]];
remainder = remainder.substring(mch.index + mch[0].length);
}
result = (parsed) ? parsed + remainder : str;
Но я думал, что следующий код будет быстрее. Он имеет меньше переменных, гораздо более кратким и использует выражение анонимной функции (или лямбда):
result = str.replace(rgx, function() {
return sub[arguments[1]];
});
Это тоже работает, но я ошибался в скорости; в Chrome это удивительно (~ 50%, последний раз я проверил) медленнее!
...
Три вопроса:
- Почему этот процесс выглядит медленнее в Chrome и (например) быстрее в Firefox?
- Есть ли вероятность того, что метод
replace()
будет быстрее по сравнению с цикломwhile()
, учитывая большую строку или массив? Если нет, то каковы его преимущества вне Code Golf? - Есть ли способ оптимизировать этот процесс, делая его как более эффективным, так и беспроблемным, как функциональный второй подход?
Я хотел бы получить представление о том, что происходит за этими процессами.
...
[ Fo (u) r запись: Я рад, что меня вызвали на использование слов "лямбда" и/или "функциональность". Я все еще изучаю понятия, поэтому не предполагайте, что я точно знаю, о чем говорю, и не стесняйтесь исправить меня, если я неправильно использую условия здесь.]