Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.06.2021, 19:54
Аспирант
Отправить личное сообщение для prototip Посмотреть профиль Найти все сообщения от prototip
 
Регистрация: 15.05.2021
Сообщений: 35

помогите решить задачку
Надо создать функцию, которая будет работать следующим образом:
1 Принимать на вход строку и подсчитывать количество всех слов в ней
2 Отсортировать их по количеству
3 Вывести n самых популярных


"aaa bb bb rrrrr aaa r t", 2 -> (("aaa", 2), ("bb", 2))

//func countWords(wordsStr: Str, n: Int) -> List[Tuple[String, Int]]

let input: string = "aaa bb bb rrrrr aaa r t";

function countWords(str: string, n: number){
    return str.split(' ').length;
}


console.log(countWords(input));

1 условие выполнил, помогите пожалуйста остальные 2 сделать
Ответить с цитированием
  #2 (permalink)  
Старый 18.06.2021, 20:07
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

prototip,
если поискать, то штук 10 на форуме есть ... но проще написать снова )))
Ответить с цитированием
  #3 (permalink)  
Старый 18.06.2021, 20:51
Аспирант
Отправить личное сообщение для prototip Посмотреть профиль Найти все сообщения от prototip
 
Регистрация: 15.05.2021
Сообщений: 35

рони,
на форуме возможно и есть но найти не могу
Ответить с цитированием
  #4 (permalink)  
Старый 18.06.2021, 20:55
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

prototip,
let input = "aaa bb bb rrrrr aaa r t";

function countWords(str, number){
    str = str.split(/\s+/);
    const obj = str.reduce((a, b) => (a[b] = (a[b]||0) + 1, a), {});
    str = Object.keys(obj).sort((a, b) => (obj[b] - obj[a]) || (b.length -  a.length));
    return str.slice(0, number);
}


alert(countWords(input, 2));
Ответить с цитированием
  #5 (permalink)  
Старый 18.06.2021, 21:05
Аспирант
Отправить личное сообщение для prototip Посмотреть профиль Найти все сообщения от prototip
 
Регистрация: 15.05.2021
Сообщений: 35

рони,
я имел ввиду другой результат
и можете показать как сделать без регулярок?
"aaa bb bb rrrrr aaa r t", 2 -> (("aaa", 2), ("bb", 2), ("rrrr",1), ("r", 1), ("t", 1))
Ответить с цитированием
  #6 (permalink)  
Старый 18.06.2021, 21:38
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

prototip,

... тут не переводимый на русский комментарий.
let input = "aaa bb bb rrrrr aaa r t";

function countWords(str, number){
    str = str.split(" ");
    const obj = str.reduce((a, b) => (a[b] = (a[b]||0) + 1, a), {});
    str = Object.keys(obj).sort((a, b) => (obj[b] - obj[a]) || (b.length -  a.length));
    if(number == void 0) number = str.length;
    return str.slice(0, number).map(a => [a, obj[a]]);
}


alert(JSON.stringify(countWords(input)));


или так

let input = "aaa bb bb rrrrr aaa r t";

function countWords(str){
    str = str.split(" ");
    const obj = str.reduce((a, b) => (a[b] = (a[b]||0) + 1, a), {});
    return Object.entries(obj).sort((a, b) => b[1] - a[1]);;
}


alert(JSON.stringify(countWords(input)));
Ответить с цитированием
  #7 (permalink)  
Старый 19.06.2021, 11:04
Аспирант
Отправить личное сообщение для prototip Посмотреть профиль Найти все сообщения от prototip
 
Регистрация: 15.05.2021
Сообщений: 35

рони,
прошу прощения это я недопонял, результат должен быть: [ [ 'aaa', 2 ], [ 'bb', 2 ] ]
let input: string = "aaa bb bb rrrrr aaa r t";

function countWords(str: string, n: number){
    let splitStr = str.split(' ');
    let res = new Map();
    for(let i = 0; i < splitStr.length; i++){
        if(!res.has(splitStr[i])){
            res.set(splitStr[i], 1)
        }else{
            let count = res.get(splitStr[i]);
            res.set(splitStr[i], count + 1)
        }
    }
let arr = Array.from(res.entries());
     return arr;

}

console.log(countWords(input, 2)); // [ [ 'aaa', 2 ], [ 'bb', 2 ], [ 'rrrrr', 1 ], [ 'r', 1 ], [ 't', 1 ] ]


решил сделать немного по другому, потому что не понял некоторые моменты в вашем коде. как по итогу отсортировать, чтобы результат в этом коде был: [ [ 'aaa', 2 ], [ 'bb', 2 ] ] и при этом если n 1 то оно выведет только одну строку, если n 3, то выведет 3 самых пополярных ?

Последний раз редактировалось prototip, 19.06.2021 в 11:15.
Ответить с цитированием
  #8 (permalink)  
Старый 19.06.2021, 13:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от prototip
при этом если n 1 то оно выведет только одну строку, если n 3, то выведет 3 самых пополярных ?
срез массива slice
Сообщение от prototip
как по итогу отсортировать, чтобы результат в этом коде был:
arr.sort((a, b) => b[1] - a[1])
Ответить с цитированием
  #9 (permalink)  
Старый 19.06.2021, 15:50
Аспирант
Отправить личное сообщение для prototip Посмотреть профиль Найти все сообщения от prototip
 
Регистрация: 15.05.2021
Сообщений: 35

рони,
благодарю
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить задачку vurdalak21 Общие вопросы Javascript 13 25.05.2021 22:05
Помогите решить задачку sanderleik Javascript под браузер 3 18.07.2020 16:10
Помогите решить задачку на jQuery. Готов заплатить. shevgeny Javascript под браузер 1 05.05.2014 12:07
Помогите решить задачку. Андрей_ Javascript под браузер 3 26.06.2012 16:21
Помогите решить задачку (Простую но непонятную) Suharik Элементы интерфейса 15 01.06.2010 22:30