Trier les propriétés des objets en fonction de leur valeur
P粉930448030
P粉930448030 2023-10-09 10:03:13
0
2
602

Si j'ai un objet JavaScript comme :

var list = {
  "you": 100, 
  "me": 75, 
  "foo": 116, 
  "bar": 15
};

Existe-t-il un moyen de trier les propriétés en fonction de leur valeur ? Alors j'ai fini par avoir

list = {
  "bar": 15, 
  "me": 75, 
  "you": 100, 
  "foo": 116
};


P粉930448030
P粉930448030

répondre à tous(2)
P粉605385621

Nous ne voulons pas copier la structure entière des données, ni utiliser un tableau là où un tableau associatif est requis.

Voici une autre façon de faire la même chose que bonna :

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
keysSorted = Object.keys(list).sort(function(a,b){return list[a]-list[b]})
console.log(keysSorted);     // bar,me,you,foo
P粉415632319

Déplacez-les dans un tableau, triez le tableau et utilisez ce tableau à vos fins. La solution est la suivante :

let maxSpeed = {
    car: 300, 
    bike: 60, 
    motorbike: 200, 
    airplane: 1000,
    helicopter: 400, 
    rocket: 8 * 60 * 60
};
let sortable = [];
for (var vehicle in maxSpeed) {
    sortable.push([vehicle, maxSpeed[vehicle]]);
}

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

// [["bike", 60], ["motorbike", 200], ["car", 300],
// ["helicopter", 400], ["airplane", 1000], ["rocket", 28800]]

Une fois que vous avez le tableau, vous pouvez reconstruire les objets du tableau dans l'ordre de votre choix, réalisant exactement ce que vous voulez faire. Cela fonctionne dans tous les navigateurs que je connais, mais cela dépend des bizarreries de mise en œuvre et peut tomber en panne à tout moment. Vous ne devez jamais faire d'hypothèses sur l'ordre des éléments dans un objet JavaScript.

let objSorted = {}
sortable.forEach(function(item){
    objSorted[item[0]]=item[1]
})

Dans ES8, vous pouvez convertir un objet en tableau en utilisant Object.entries() :

const maxSpeed = {
    car: 300, 
    bike: 60, 
    motorbike: 200, 
    airplane: 1000,
    helicopter: 400, 
    rocket: 8 * 60 * 60
};

const sortable = Object.entries(maxSpeed)
    .sort(([,a],[,b]) => a-b)
    .reduce((r, [k, v]) => ({ ...r, [k]: v }), {});

console.log(sortable);
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal