Подсчет вхождений в строку из массива ключевых слов в JavaScript - PullRequest
2 голосов
/ 09 сентября 2009

У меня есть массив:

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

и строка:

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

Я хочу посчитать, сколько раз каждое ключевое слово в массиве появляется в строке, но не могу найти лучший способ сделать это.

Ответы [ 4 ]

5 голосов
/ 09 сентября 2009

Вот моя версия:

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

Попробуйте здесь .

4 голосов
/ 09 сентября 2009

Попробуйте что-нибудь подобное. Вы можете изменить то, что вы делаете с помощью count - сохранить его в другом массиве, отобразить его (что и делает этот скрипт) и т. Д.

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 голос
/ 09 сентября 2009

Этот код только создает экземпляр одного RegExp объекта и использует обратный цикл while. Я почти уверен, что это так быстро, как ты можешь, не нарушая законы физики :)

Вот что происходит:

  1. Создание строки регулярного выражения с использованием обратного цикла while
  2. Создайте только один объект RegExp и match() в строке
  3. Подсчитать длину массива, возвращаемого функцией 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
1 голос
/ 09 сентября 2009
<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>
...