Сортировка массива типа ([ ['a', 4], ['c', 6], ['x', 8]) по алфавиту и числу

106
09 сентября 2021, 15:30
let text = "As long as I'm learning something, I figure I'm OK - it's a decent day."
const letterFrequency = (text) => {
   let uniq = Array.from(new Set([...text.toLowerCase().replace(/\W/g, '')]));
   return uniq
      .map(el => [el, text.match(new RegExp(el, 'gi')).length])
      .sort((a, b) => b[1] - a[1]);
};

Должен вернуть

[["i", 7], ["a", 5], ["e", 5], ["n", 5], ["g", 4], ["s", 4], ["m", 3], ["o", 3], ["t", 3], ["d", 2], ["l", 2], ["r", 2], ["c", 1], ["f", 1], ["h", 1], ["k", 1], ["u", 1], ["y", 1]]

Как мне можно реализовать такую сортировку?

Answer 1

Если числа равны, то сортировать по алфавиту, если нет, то по числу.

let text = "As long as I'm learning something, I figure I'm OK - it's a decent day." 
 
const letterFrequency = (text) => { 
  let uniq = Array.from(new Set([...text.toLowerCase().replace(/\W/g, '')])); 
  return uniq 
    .map(el => [el, text.match(new RegExp(el, 'gi')).length]) 
    .sort((a, b) => { 
      if (a[1] == b[1]) { 
        return a[0].charCodeAt(0) - b[0].charCodeAt(0); 
      } 
      return b[1] - a[1]; 
    }); 
}; 
 
console.log(letterFrequency(text));

Answer 2

Более быстрый вариант, за счет сокращения числа проходов:
Другой вариант (по факту, он оказался медленнее

READ ALSO
Как остановить setInterval в данном случае?

Как остановить setInterval в данном случае?

Мне нужно остановить данный setInterval через 3 секундыПодскажите пожалуйста как это реализовать ?

165
Как реализовать, чтобы данный скрипт срабатывал раз в 6сек.?

Как реализовать, чтобы данный скрипт срабатывал раз в 6сек.?

Как реализовать, чтобы данный скрипт срабатывал раз в 6 сек?

113
C++, Google Tests, утечки макетных объектов и testing::Mock::AllowLeak()

C++, Google Tests, утечки макетных объектов и testing::Mock::AllowLeak()

Я пытаюсь поправить тесты (Google Tests), которые писал не я, и у меня есть несколько вопросов, на которые я не смог найти ответы

112