Я не смог найти hasItem, setItem или getItem в прототипах Hash, как предложил tvanfosson, но использовал set и get и написал hasItem на основе get. Но профилирование показало, что прототипы Hash медленнее по сравнению с нативным объектом javascripts.
Если у вас есть массив с ключевыми словами, преобразуйте его в хеш-объект с ключевыми словами в качестве ключа и значением 0:
function prepareCount(words) {
var result = {};
for (var i=0,len=words.length; i < len; i++) {
result[words[i]] = 0;
}
return result;
}
Вместо того, чтобы разбивать строку и проходить по ней с помощью оператора for, вы можете использовать функцию в качестве параметра для замены. В тестах я делал это было намного быстрее. В регулярном выражении я выбрал соответствие всем, кроме пробелов. Возможно, вы захотите добавить другие разделители, такие как скобки, запятая, точка и тире и т. Д., Или, если вы знаете, что текст только ASCII, вы можете использовать вместо него a-z.
function countKeywords(text,wordcount) {
text.replace(/[^\s]+/g,function(s) {
if (wordcount[s]!==undefined) { ++wordcount[s];}
return "";
});
return wordcount;
}
Чтобы использовать это:
var wordcount = countKeywords(document.documentElement.textContent.toLowerCase(),prepareCount(["my","key","words"]));
Обновление:
Используйте это регулярное выражение, чтобы исключить все разделители в ASCII, но подчеркивание (допускает символы не ASCII):
/[^\s\x00-\x2F\x3A-\x40\x5B-\x5E\x60\x7B-\x7F]+/g
если вы знаете, что ваш текст с ключевыми словами только ASCII, вы можете вместо этого использовать:
/ [A-Z] +