Возможно, вы захотите избежать любых итераций дублирующих элементов и сохранить уникальный массив результатов. Поскольку любой из итераторов Array.prototype будет включать каждый из элементов, они могут быть не идеальным решением для этого. Иногда простые старые циклы делают работу лучше всего ... (Вы также можете явно вытеснить любые специальные символы в вашем регулярном выражении).
function wordFrequency(txt) {
var words = txt.split(/[ \.\?!,\*'"]+/),
seen = [];
for (var i = 0; i < words.length; i++) {
var w = words[i],
found = false;
for (var j = 0; j < seen.length; j++) {
if (w === seen[j].text) {
seen[j].size++;
found = true;
break;
}
}
if (!found) seen.push({ text: w, size: 1 });
}
return seen;
}
(Обратите внимание, что внутренний для цикла не посещал для первого слова, так что первое слово будет выталкиваться к пачке видела и внутреннее для цикла будет начинаться с вторым словом по сравнению с первый. Только те слова, которые мы еще не видели, добавлены в видимый стек, что делает его массивом уникальных элементов.)
И вот эквивалент с использованием Array.prototype.forEach() и Array. prototype.indexOf(), но мы должны добавить еще один промежуточный стек результатов для последнего. Поэтому нам нужно добавить еще одну итерацию, чтобы получить окончательный результат. (Мы не должны делать это с помощью Array.prototype.findIndex(), но это не является стандартным методом.)
function wordFrequency2(txt) {
var words = txt.split(/[ \.\?!,\*'"]+/),
seen = [],
freq = [];
// get frequencies
words.forEach(function (w) {
var idx = seen.indexOf(w);
if (idx >= 0) {
freq[idx]++;
}
else {
seen.push(w);
freq.push(1);
}
});
// produce the results array
var r = [];
seen.forEach(function (w, idx) {
r.push({ text: w, size: freq[idx] });
});
return r;
}
Положив оптимизации во внимание, первая версия с использованием явных петель будет, вероятно, выполнять быстрее ...
Это нормально в моей консоли – Nickool
но он повторил результат я попытался этот: wordFrequency («negin! kjs $ wkjh * df oiuw & skdjhh»); – Nickool
Я пытаюсь использовать большой фрагмент текста, и я каждый раз теряю память, даже когда пытался с jsfiddle. :( – diegodacal