Частота символов — сортировка элементов по алфавиту после того, как они были отсортированы по частоте

Ссылка на вызов Codewars

Мне удалось создать карту частот для подсчета частоты букв для строки:

function letterFrequency(text){
    text = text.toLowerCase();
    let map = {};
    let array = text.split('');
    array.forEach((value, index) => {
      if (!map[value]) {
        map[value] = 0;
      }
      map[value] += 1;
    });
    return Object.entries(map).filter((el) => el[0] !== ' ')
    //sorts array according to count
    .sort((a, b) => b[1] - a[1]);
    //how to sort alphabetically when letters have same count?
}
console.log(letterFrequency('aaAabb dddDD hhcc'));

Но я не смог понять, как сортировать по алфавиту, когда количество частот одинаково.

I.e.

[['d',5], ['a',4], ['b',2], ['h',2], ['c',2]]

Вместо этого должно быть:

[['d',5], ['a',4], ['b',2], ['c',2], ['h',2]]

Как сохранить частоту в качестве основного приоритета сортировки, а затем отсортировать в алфавитном порядке после сортировки по частоте?

Также попытка этого, к сожалению, не имела никакого эффекта:

function letterFrequency(text){
    text = text.toLowerCase();
    let map = {};
    let array = text.split('');
    array.forEach((value, index) => {
      if (!map[value]) {
        map[value] = 0;
      }
      map[value] += 1;
    });
    return Object.entries(map).filter((el) => el[0] !== ' ')
    .sort((a, b) => b[1] - a[1])
    .sort((a, b) => a[0] - b[0]);
}


person HappyHands31    schedule 08.10.2019    source источник
comment
Вы можете использовать ответ здесь: stackoverflow.com/a/6913821/215552; просто передайте индексы вместо имен свойств.   -  person Heretic Monkey    schedule 08.10.2019
comment
Возможный дубликат Javascript: сортировка многомерного массива   -  person Heretic Monkey    schedule 08.10.2019


Ответы (2)


Вы можете "или" (||) разницу в счете с результатом localeCompare, так что если разница в подсчете составляет 0, localeCompare имеет приоритет:

function letterFrequency(text) {
  text = text.toLowerCase();
  let map = {};
  let array = text.split('');
  array.forEach((value, index) => {
    if (!map[value]) {
      map[value] = 0;
    }
    map[value] += 1;
  });
  return Object.entries(map).filter((el) => el[0] !== ' ')
    .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]));
}

console.log(letterFrequency('dadbahddbccdh'));

person slider    schedule 08.10.2019

можно сделать два вида. сортировать по алфавиту, а затем по номерам, таким образом, алфавитный порядок сохраняется, когда вы делаете свою числовую сортировку после

var x = [['d',5], ['a',4], ['b',2], ['h',2], ['c',2]];
x.sort(function(a, b){
    if(a[0] < b[0]) { return -1; }
    if(a[0] > b[0]) { return 1; }
    return 0;
}).sort(function(a, b){
    return b[1] - a[1]})
person leo    schedule 08.10.2019