Этот код только создает экземпляр одного RegExp
объекта и использует обратный цикл while. Я почти уверен, что это так быстро, как ты можешь, не нарушая законы физики :)
Вот что происходит:
- Создание строки регулярного выражения с использованием обратного цикла while
- Создайте только один объект RegExp и
match()
в строке
- Подсчитать длину массива, возвращаемого функцией
match()
Вот реализация:
var countries = ["Afganistan", "America", "Island"];
var sentence = "I love Afganistan, America.. And I love America some more";
function countOccurrences(a, s)
{
var re = "",
l = a.length,
m;
while (l)
{
l--;
re += a[l];
if (l > 0) re += "|";
}
m = s.match(new RegExp(re, "gi")) || [];
return m.length;
}
Примечание. Я, конечно, ожидаю, что записи в массиве будут очищены для любых специальных символов, которые нарушат регулярное выражение, построенное в функции.
var occurrences = function countOccurrences(countries, sentence); // returns 3