Contare le occorrenze nella stringa dall'array di parole chiave in JavaScript
-
05-07-2019 - |
Domanda
Ho un array:
var locations = ['Afghanistan','Albania','Algeria','New York'];
e una stringa:
var string = 'I love Afghanistan New York Afghanistan Andorra Andorra Algeria New York';
Voglio contare il numero di volte in cui ogni parola chiave dell'array appare nella stringa ma non riesco a capire il modo migliore per farlo.
Soluzione
Ecco la mia versione:
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
Provalo qui .
Altri suggerimenti
Prova qualcosa del genere. Puoi modificare ciò che fai con count
- memorizzarlo in un altro array, visualizzarlo (che è ciò che fa questo script), ecc.
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]);
}
}
<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>
Questo codice crea solo un'istanza di un RegExp
e usa un ciclo while inverso. Sono abbastanza sicuro che sia il più veloce possibile senza infrangere le leggi della fisica :)
Questo sta succedendo:
- Costruisci una stringa di espressioni regolari usando un ciclo while inverso
- Nuovo solo un oggetto RegExp e
match ()
sulla stringa - Conta la lunghezza dell'array restituito dalla funzione
match ()
Ecco l'implementazione:
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;
}
Nota: ovviamente mi aspetto che le voci nell'array vengano disinfettate per eventuali caratteri speciali che spezzeranno l'espressione regolare costruita all'interno della funzione.
var occurrences = function countOccurrences(countries, sentence); // returns 3