2009-09-09 6 views
2

j'ai un tableau:Count occurences dans la chaîne de tableau mot-clé dans javascript

var locations = ['Afghanistan','Albania','Algeria','New York']; 

et une chaîne:

var string = 'I love Afghanistan New York Afghanistan Andorra Andorra Algeria New York'; 

Je veux compter le nombre de fois où chaque mot-clé dans le tableau apparaît dans la chaîne mais ne peut pas trouver la meilleure façon de le faire.

Répondre

5

Voici ma version:

function countItems(a, s) { 
    var x, i, output = {}; 
    for (x = 0; x < a.length; x++) { 
     i = 0; 
     output[a[x]] = 0; 
     while ((i = s.indexOf(a[x], i)) > -1) { 
      output[a[x]]++; 
      i++ 
     } 
    } 
    return output; 
} 

var result = countItems(locations, string); 
// result['Albania'] === 0 

Essayez-le here.

+0

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

+0

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

4

Essayez quelque chose comme ceci. Vous pouvez modifier ce que vous faites avec count - le stocker dans un autre tableau, l'afficher (qui est ce que ce script), etc.

var locations = ['Afghanistan','Albania','Algeria','New York']; 
var str = 'I love Afghanistan New York Afghanistan Andorra Andorra Algeria New York'; 


for(var i=0; i<locations.length; i++) { 
    var pattern = new RegExp(locations[i], "g"); 
    var m = str.match(pattern); 
    if (m != null) 
    { 
     var count = m.length; // the count 
     alert("There are " + count + " occurrences of " + locations[i]); 
    } 
} 
1
<script language="JavaScript"> 
var locations = ['Afghanistan','Albania','Algeria','New York']; 

var string1 = 'I love Afghanistan New York Afghanistan Andorra Andorra Algeria New York'; 

for (var i=0;i<locations.length;i++) { 
    nCount = string1.split(locations[i]).length-1; 
    document.write(locations[i] + ' is found ' + nCount + ' times<br>'); 
} 

</script> 
+0

Ingénieux utiliser le modèle comme séparateur ... Un peu exagéré, mais, en ce qui concerne vous jeter le tableau. – xtofl

1

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:

  1. Construct chaîne d'expression régulière en utilisant une boucle while inverse
  2. Nouveau juste un objet RegExp et match() sur la chaîne
  3. 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 
+0

cela semble être une bonne solution mais pas à mon problème. Je veux connaître le compte pour CHAQUE mot-clé. pas pour tous ensemble. Merci quand même! – StefanHayden

+0

Ah! J'ai mal compris votre question. Merci pour le compliment bien :) – roosteronacid

Questions connexes