Сортировать объект JS по убыванию значения (с неизвестным ключом) - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь отсортировать простой объект с неизвестными ключами по наибольшему целочисленному значению.Есть ли аккуратный код для этого?

Я пробовал это, но безуспешно.

let fixSort = {};
  Object.keys(leaderboard).sort().forEach(function(key){
  fixSort[key] = leaderboard[key];
});
console.log(fixSort);

Вот объект:

let leaderboard = {
  "Bob" : 2,
  "Jimmy" : 1,
  "Emma" : 6
}

Моя цельэто сортировать как:

{
  "Emma" : 6,
  "Bob" : 2,
  "Jimmy" : 1
}

Ответы [ 4 ]

4 голосов
/ 04 июня 2019

Что ж, "вы могли бы":

 const fixSort = {};

 for(const [k, v] of Object.entries(leaderboard).sort((a, b) => a[1] - b[1]))
  fixSort[k] = v;
 }

Но это, честно говоря, плохой способ структурировать это (поскольку добавление новых пар ключ-значение невозможно, так как вы должны воссоздать все это).Вместо этого используйте массив объектов:

  const leaderboard = [
   { name: "Jack", score: 7 },
   //...
 ];

. Если вам нужна таблица поиска, просто создайте ее на основе этого объекта:

 const byName = {};
 for(const player of leaderboard)
   byName[player.name] = player;

. Вы также можете отсортировать массив:

 leaderboard.sort((a, b) => a.score - b.score);

Тогда вы можете легко добавлять / удалять игроков.

 function addToLeaderBoard(player) {
   leaderboard.push(player);
   leaderboard.sort((a, b) => a.score - b.score);
   byName[player.name] = player;
 }
0 голосов
/ 04 июня 2019

Другой вариант - используйте Object.entries, чтобы создать массив из leaderboard, отсортировать его по значению, а затем перестроить отдельные объекты в массив, чтобы сохранить отсортированный порядок.

const leaderboard = {
  "Bob" : 2,
  "Jimmy" : 1,
  "Emma" : 6
}

console.log(Object.entries(leaderboard).sort((a,b) => b[1] - a[1]).map(person => ({[person[0]]: person[1]})))
0 голосов
/ 04 июня 2019
let leaderboard = {
  "Bob" : 2,
  "Jimmy" : 1,
  "Emma" : 6
}

var newObj={};

Object.keys(leaderboard).sort((a,b)=>leaderboard[b]-leaderboard[a]).forEach((i, v)=> newObj[i]=leaderboard[i]);

enter image description here

Для изменения объекта в отсортированный массив, потому что если вы попытаетесь развернуть объект в консоли, он покажет, что вы снова не отсортированы, но в действительности этоотсортирован, для полной ясности, наши сомнения, мы можем изменить этот объект для использования массива ниже кода

var result = Object.keys(newObj).map(function(key) {
  return [key, newObj[key]];
});
console.log(result);

он будет выглядеть как на рисунке ниже enter image description here

0 голосов
/ 04 июня 2019

Вы близки, но Array.prototype.sort может принять пользовательскую функцию сравнения. Это то, что вы хотите.

// Gives you an array
const keyArray = Object.keys(leaderboard)
const fixedSort = keyArray.sort((a, b) => {
  if (leaderboard[a] > leaderboard[b]) {
    return 1
  }
  return -1
})
console.log(fixedSort);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...