Pregunta

Tengo una matriz:

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

y una cadena:

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

Quiero contar el número de veces que cada palabra clave de la matriz aparece en la cadena pero no puedo averiguar la mejor manera de hacerlo.

¿Fue útil?

Solución

Aquí está mi versión:

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

Pruébelo aquí .

Otros consejos

Pruebe algo como esto. Puede modificar lo que hace con count : almacénelo en otra matriz, muéstrelo (que es lo que hace este 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]);
    }
}
<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>

Este código solo crea una instancia de un RegExp objeto y utiliza un bucle while inverso. Estoy bastante seguro de que esto es lo más rápido que puedas sin romper las leyes de la física :)

Esto es lo que está sucediendo:

  1. Construya una cadena de expresión regular usando un ciclo while inverso
  2. Nueva hasta un solo objeto RegExp, y match () en la cadena
  3. Cuente la longitud de la matriz devuelta por la función match ()

Aquí está la implementación:

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: por supuesto, espero que las entradas en la matriz se desinfecten para cualquier carácter especial que rompa la expresión regular construida dentro de la función.

var occurrences = function countOccurrences(countries, sentence); // returns 3
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top