Задача, преобразовать строку в объект вида:
Написал функцию:
function countWords(str) {
var arr = str.split(' ');
var obj = {};
for (var i = 0; i < arr.length; i++) {
var word = arr[i];
obj[word] = str.split(word).length - 1;
}
return obj;
}
console.log(countWords('ask a bunch get a bunch'));
// Результат --> {ask: 1, a: 3, bunch: 2, get: 1}
// Ожидаемый результат --> {ask: 1, a: 2, bunch: 2, get: 1}
Как добиться, чтобы 'a' из слова 'ask' не считалась вхождением слова 'a'?
Пытался регулярными выражениями, но не понимаю, как приделать '\b' к переменной word в split(word).
function count(s) {
var a = s.split(/[^a-zа-яё]+/ig).filter(Boolean)
var res = Object.create(null)
for (var q=0; q<a.length; ++q) {
res[a[q]] = ~~res[a[q]] + 1
}
return res
}
console.log(count("Just a test with toString and русский текст, test again and текст again!"))
.as-console-wrapper.as-console-wrapper { max-height: 100vh; }
Что тут интересного:
.filter(Boolean)
отсеивает пустые строки в случае, если в начале или конце строки стояли разделителиObject.create(null)
создаёт чистый объект, у которого в прототипе нет ничего, в том числе методов как toString~~res[a[q]]
приводит нечисловой мусор в 0 - в данном случае надо для undefined, но если заменить Object.create(null)
на {}
, то поможет ещё и с toString
, т. к. это не число. Из минусов - ограничение в 231-1, но столько слов в строке не будет.Хотя более элегантный способ уже и приведен в ответе @Qwertiy оставлю этот код как один вариантов.
function countWords(str) {
var arr = str.split(' ');
var obj = {};
for (var i = 0; i < arr.length; i++) {
var word = arr[i];
if( !obj[word]) obj[word] = 1
else obj[word]++;
}
return obj;
}
console.log(countWords('ask a bunch get a bunch'));
var obj = {}
следует заменить на Object.create(null)
, как написано в комментариях.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Ищу решение для задачиЕсть небольшой кусок js кода открывающего-закрывающего боковую панель навигации
Помогите создать трёхуровневое меню на css на подобии этого:
Нужно реализовать выбор 12 дат в календаре начиная от выбраной даты, к примеру если выбрал 1009