Ce code instancie uniquement un objetRegExp
et utilise une boucle while inverse. Je suis sûr que ce soit aussi vite que vous pouvez aller sans enfreindre les lois de la physique :)
Voici ce qu'il se passe:
- Construct chaîne d'expression régulière en utilisant une boucle while inverse
- Nouveau juste un objet RegExp et
match()
sur la chaîne
- Count la longueur du tableau retourné par la fonction
match()
Voici le impl ementation:
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;
}
Note: Je suis bien sûr les attends entrées dans le tableau à désinfecté pour tous les caractères spéciaux qui brisera l'expression régulière construit dans la fonction.
var occurrences = function countOccurrences(countries, sentence); // returns 3
Suggestion: Faire une boucle while inverse. Cela devrait accélérer un peu les choses, lorsqu'il s'agit d'une grande chaîne et/ou d'un grand tableau. – roosteronacid
cela fonctionne très bien. La seule chose que j'ai changé est que je déteste comment JS fait des tableaux associatifs donc à la place je retourne un tableau multi-dimensionnel: output [mot-clé, compte] – StefanHayden