От Счета к Списку лидеров сортировки словаря в JS - PullRequest
1 голос
/ 19 марта 2020

Это, вероятно, классическая c проблема: у меня есть «словарь» очков для каждого игрока:

var scores = {
    'player1' : 9,
    'player2' : 3,
    'player3' : 7,
    'player4' : 5
}

Я хочу преобразовать это в таблицу лидеров с ключом, позиция рассчитывается по количество игроков и значение, имя игрока:

var leaderboard = {
    1 : 'player1',
    2 : 'player3',
    3 : 'player4',
    4 : 'player2'
}

Как мне сделать это чистым способом, не слишком путаясь с временными списками и словарями? Спасибо.

1 Ответ

1 голос
/ 19 марта 2020

Вы можете получить записи вашего объекта (с Object.entries()) и .sort() их, чтобы получить заказ для вашей таблицы лидеров. Затем используйте .map() в ваших отсортированных записях, чтобы сопоставить их с объектами, где значение объекта является игроком, а индекс + 1 (i+1) записи является ключом. Затем вы можете использовать Object.assign() для создания большего объекта из этого массива:

const scores = {
    'player1' : 9,
    'player2' : 3,
    'player3' : 7,
    'player4' : 5
};

const leaderboard = Object.assign(
   {}, 
   ...Object.entries(scores)
       .sort(([,a], [,b]) => b-a)
       .map(([p], i) => ({[i+1]: p}))
);
console.log(leaderboard);

Примечание: Требуемый вывод - это объект с пронумерованными непрерывными клавишами. Обычно вы используете массив для хранения данных этого типа, где элемент в позиции 0 является «верхним» лидером. Для вывода массива вы упрощаете приведенный выше код:

const scores = {
    'player1' : 9,
    'player2' : 3,
    'player3' : 7,
    'player4' : 5
};

const leaderboard = Object.entries(scores)
       .sort(([,a], [,b]) => b-a)
       .map(([p]) => p)

console.log(leaderboard);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...