Проблема в том, что когда вы делаете
str.split(n)
, если n
короткий, особенно если это один символ, такой как a
, то вероятные вхождения его внутри других слов в строке будет также разделен.Например, 'abc a abc'.split('a')
приведет к массиву длиной 4, хотя в строке есть только один a
.
Одним из возможных шагов к решению проблемы будет использование регулярного выражения и установка границ слов.вокруг слова:
output[n] = str.split(new RegExp(String.raw`\b${n}\b`)).length - 1
Но было бы более элегантно не использовать промежуточные массивы, а вместо этого использовать reduce
:
const countWords = str => str.split(' ').reduce((a, word) => {
a[word] = (a[word] || 0) + 1;
return a;
}, {});
console.log(countWords('ask a bunch, try a bunch, get a bunch'));