Question Tri de l'objet JavaScript par valeur de propriété


Si j'ai un objet JavaScript tel que:

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

Existe-t-il un moyen de trier les propriétés en fonction de la valeur? Alors que je me retrouve avec

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

J'ai un vrai moment mort cérébral à ce sujet.


450
2017-07-01 15:06


origine


Réponses:


Déplacez-les dans un tableau, triez-le, puis utilisez ce tableau pour vos besoins. Voici une solution:

var maxSpeed = {
    car: 300, 
    bike: 60, 
    motorbike: 200, 
    airplane: 1000,
    helicopter: 400, 
    rocket: 8 * 60 * 60
};
var 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 l'objet à partir du tableau dans l'ordre de votre choix, réalisant ainsi exactement ce que vous souhaitez faire. Cela fonctionnerait dans tous les navigateurs que je connaisse, mais cela dépendrait d'une bizarrerie d'implémentation et pourrait se briser à tout moment. Vous ne devez jamais faire d'hypothèses sur l'ordre des éléments dans un objet JavaScript.


506
2017-07-01 15:33



Nous ne voulons pas dupliquer la structure de données entière, ou utiliser un tableau où nous avons besoin d'un tableau associatif.

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


292
2018-05-28 14:01



Vos objets peuvent avoir n'importe quelle quantité de propriétés et vous pouvez choisir de trier selon la propriété d'objet que vous voulez, nombre ou chaîne, si vous placez les objets dans un tableau. Considérez ce tableau:

var arrayOfObjects = [   
    {
        name: 'Diana',
        born: 1373925600000, // Mon, Jul 15 2013
        num: 4,
        sex: 'female'
    },
    {

        name: 'Beyonce',
        born: 1366832953000, // Wed, Apr 24 2013
        num: 2,
        sex: 'female'
    },
    {            
        name: 'Albert',
        born: 1370288700000, // Mon, Jun 3 2013
        num: 3,
        sex: 'male'
    },    
    {
        name: 'Doris',
        born: 1354412087000, // Sat, Dec 1 2012
        num: 1,
        sex: 'female'
    }
];

trier par date de naissance, le plus ancien en premier

// use slice() to copy the array and not just make a reference
var byDate = arrayOfObjects.slice(0);
byDate.sort(function(a,b) {
    return a.born - b.born;
});
console.log('by date:');
console.log(byDate);

Trier par nom

var byName = arrayOfObjects.slice(0);
byName.sort(function(a,b) {
    var x = a.name.toLowerCase();
    var y = b.name.toLowerCase();
    return x < y ? -1 : x > y ? 1 : 0;
});

console.log('by name:');
console.log(byName);

http://jsfiddle.net/xsM5s/16/


147
2017-10-11 19:53



Par souci d'exhaustivité, cette fonction renvoie tableau trié des propriétés de l'objet:

function sortObject(obj) {
    var arr = [];
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            arr.push({
                'key': prop,
                'value': obj[prop]
            });
        }
    }
    arr.sort(function(a, b) { return a.value - b.value; });
    //arr.sort(function(a, b) { a.value.toLowerCase().localeCompare(b.value.toLowerCase()); }); //use this to sort as strings
    return arr; // returns array
}

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
var arr = sortObject(list);
console.log(arr); // [{key:"bar", value:15}, {key:"me", value:75}, {key:"you", value:100}, {key:"foo", value:116}]

Jsfiddle avec le code ci-dessus est ici. Cette solution est basée sur Cet article.

Le violon mis à jour pour trier les cordes est ici. Vous pouvez supprimer les deux conversions supplémentaires .toLowerCase () pour une comparaison de chaîne sensible à la casse.


52
2017-07-05 21:22



Les objets JavaScript sont désordonnés par définition (voir le ECMAScript Language spécification, section 8.6). La spécification du langage ne garantit même pas que, si vous itérez deux fois de suite les propriétés d'un objet, elles sortiront dans le même ordre la deuxième fois.

Si vous avez besoin de choses à commander, utilisez un tableau et la méthode Array.prototype.sort.


33
2017-07-01 15:12



Une version "fléchée" de @marcusR's répondre pour référence

var myObj = {"you": 100, "me": 75, "foo": 116, "bar": 15};
keysSorted = Object.keys(myObj).sort((a,b) => myObj[a]-myObj[b])
alert(keysSorted);     // bar,me,you,foo

MISE À JOUR: EDITER Avril 2017  - Cela renvoie un trié myObj objet défini ci-dessus.

Object
 .keys(myObj)
 .sort((a, b) => myObj[a]-myObj[b])
 .reduce((_sortedObj, key) => ({
   ..._sortedObj, 
   [key]: myObj[key]
 }), {})

Essayez-le ici!


16
2017-09-12 01:29



D'accordComme vous le savez peut-être, javascript a Trier() fonction, pour trier les tableaux, mais rien pour objet ...

Dans ce cas, nous devons d'une manière ou d'une autre obtenir le tableau des clés et les trier, c'est la raison pour laquelle les API vous donnent des objets dans un tableau la plupart du temps, parce que Array a plus de fonctions natives la solotion rapide utilise Object.key qui retournent un tableau des clés de l'objet, je crée le ES6 fonction ci-dessous qui fait le travail pour vous, il utilise natif Trier() et réduire() fonctions en javascript:

function sortObject(obj) {
  return Object.keys(obj)
    .sort().reduce((a, v) => {
    a[v] = obj[v];
    return a; }, {});
}

Et maintenant vous pouvez l'utiliser comme ceci:

let myObject = {a: 1, c: 3, e: 5, b: 2, d: 4};
let sortedMyObject = sortObject(myObject);

Vérifiez l'objetadresse et vous pouvez voir le résultat trié par des clés comme ceci:

{a: 1, b: 2, c: 3, d: 4, e: 5}

De cette manière, l'objet principal ne sera pas touché et nous obtiendrons un nouvel objet.

Je crée également l'image ci-dessous, pour que les étapes de la fonction soient plus claires, au cas où vous auriez besoin de la changer un peu pour vous y rendre:

Sorting a javascript object by property value


12
2017-08-02 13:31



ECMAScript 2017 introduit Object.values / Object.entries. Comme son nom l’indique, le premier regroupe toutes les valeurs d’un objet dans un tableau, et le second fait tout l’objet dans un tableau de [key, value] des tableaux; L'équivalent de Python dict.values() et dict.items().

Les fonctionnalités facilitent le tri d'un hachage dans un objet commandé. A partir de maintenant, seule une petite partie des plates-formes JavaScript les supporte, mais vous pouvez l'essayer sur Firefox 47+.

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

let entries = Object.entries(obj);
// [["you",100],["me",75],["foo",116],["bar",15]]

let sorted = entries.sort((a, b) => a[1] - b[1]);
// [["bar",15],["me",75],["you",100],["foo",116]]

11
2018-06-03 06:11