Как найти слово из одной буквы в строке?

314
06 сентября 2017, 16:27

Задача, преобразовать строку в объект вида:

  • имя свойства - слово из строки,
  • значение свойства - количество вхождений в строку.

Написал функцию:

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).

Answer 1

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, но столько слов в строке не будет.
Answer 2

Хотя более элегантный способ уже и приведен в ответе @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), как написано в комментариях.

READ ALSO
Модули, устанавливаемые извне

Модули, устанавливаемые извне

Доброго времени суток

315
Затемнение фона по клику

Затемнение фона по клику

Ищу решение для задачиЕсть небольшой кусок js кода открывающего-закрывающего боковую панель навигации

262
Помогите создать трёхуровневое меню на css [требует правки]

Помогите создать трёхуровневое меню на css [требует правки]

Помогите создать трёхуровневое меню на css на подобии этого:

363
Не считает дни в календаре которые должны быть доступны при выборе

Не считает дни в календаре которые должны быть доступны при выборе

Нужно реализовать выбор 12 дат в календаре начиная от выбраной даты, к примеру если выбрал 1009

338