1
votes

Tri d'un objet en fonction des valeurs entières de propriété dans l'ordre décroissant

Donc, j'ai un objet de villes avec des scores qui leur sont attachés, comme ceci:
let cityScores = {Milan: 1, Malte: 3, Palma: 5, Ibiza: 2, Porto: 1};
Ce que je veux faire, c'est obtenir un tableau, avec la ville la plus performante comme premier élément (dans ce cas, Palma), et suivre les villes en décroissant les scores.

J'y ai réfléchi longuement et longuement et j'ai trouvé cette solution. Je voulais juste demander, n'y a-t-il rien de mieux là-bas? Une méthode utile ou une autre solution qui pourrait me manquer? Voici comment je fais:

Tout d'abord, je trouve la valeur maximale dans l'objet. Ensuite, je vérifie pour chaque ville et je m'assure que celle avec la valeur la plus élevée est / sont au début du tableau. Ensuite, j'ai essayé d'utiliser .push () pour pousser les villes les moins performantes jusqu'à la fin, mais je ne pouvais tout simplement pas. Je ne peux pas pousser "ville" correctement pendant que je suis encore en boucle sur ces villes, parce que les villes sont aléatoires. La meilleure approche que j'ai trouvée était de "se souvenir" des villes par leur score et de les stocker dans ces tableaux (SecondaryCities, tertiaryCities, etc.), puis de les pousser une par une.

let cityScores = { Milan: 1, Malta: 3, Palma: 5, Ibiza: 2, Porto: 1 };
let cityScoreKeys = Object.keys(cityScores);
let cityScoreValues = Object.values(cityScores);
let maxScore = Math.max(...cityScoreValues);
let arrangedCities = [];
let secondaryCities = [];
let tertiaryCities = [];
let quaternaryCities = [];
for (i = 0; i < cityScoreKeys.length; i++) {
  if (cityScores[cityScoreKeys[i]] == maxScore) {
    arrangedCities.unshift(cityScoreKeys[i]);
  } else if (cityScores[cityScoreKeys[i]] === maxScore - 1) {
    secondaryCities.push(cityScoreKeys[i]);
  } else if (cityScores[cityScoreKeys[i]] === maxScore - 2) {
    tertiaryCities.push(cityScoreKeys[i]);
  } else if (cityScores[cityScoreKeys[i]] === maxScore - 3) {
    quaternaryCities.push(cityScoreKeys[i]);
  }
}
let nonMaxCities = [secondaryCities, tertiaryCities, quaternaryCities];
for (i = 0; i < nonMaxCities.length; i++) {
  arrangedCities.push(...nonMaxCities[i]);
}


0 commentaires

5 Réponses :


2
votes

Convertissez en tableau en utilisant Object.entries puis utilisez les méthodes disponibles pour un tableau:

let parsed = 
    Object.entries(cityScores)
    .sort((a, b) => b[1] - a[1])
    .map(x => x[0]);

Merci JasonWoof pour la fonction de tri plus simple.


1 commentaires

fonction de tri plus simple: .sort ((a, b) => b [1] - a [1])



3
votes

Voici ma solution:

let cityScores = { Milan: 1, Malta: 3, Palma: 5, Ibiza: 2, Porto: 1 };

let obj = Object.keys(cityScores).map(function(key) {
  return {key, value: cityScores[key]};
});

let result = obj.sort((a,b) => b.value - a.value);

console.log(result);


0 commentaires

2
votes

Vous pouvez simplement utiliser Object.keys et trier les clés en fonction de la valeur sur une seule ligne.

Voici un exemple fonctionnel.

let cityScores = {
  Milan: 1,
  Malta: 3,
  Palma: 5,
  Ibiza: 2,
  Porto: 1
};

const sortedCities = Object.keys(cityScores).sort((a, b) => cityScores[b] - cityScores[a]);

console.log(sortedCities);


0 commentaires

1
votes

Ajoutez-les à un tableau pour pouvoir les trier selon vos besoins

let cityScores = { Milan: 1, Malta: 3, Palma: 5, Ibiza: 2, Porto: 1 };

let sortable = [];
for (var score in cityScores) {
    sortable.push([score, cityScores[score]]);
}

sortable.sort(function(a, b) {
    return a[1] - b[1];
});


0 commentaires

1
votes

Vous pouvez utiliser ma solution, je prends simplement l'aide des fonctions JavaScript intégrées. Les étapes sont

  1. Convertir un objet en tableau 2D (comme [["Milan", 1], ["Malta", 3]])
  2. Triez ensuite le tableau en fonction du score de chaque élément (index 1).
  3. Renvoyer uniquement le nom de la ville (index 0)

let obj = { Milan: 1, Malta: 3, Palma: 5, Ibiza: 2, Porto: 1 };
let newArr = Array.from(Object.entries(obj)).sort((a,b)=> b[1]-a[1]).map(d=> d[0]);
console.log(newArr);


0 commentaires