842 votes

Tri Objet JavaScript par la valeur de la propriété

Si j'ai un objet JavaScript tels que:

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

est-il un moyen de trier les propriétés sur la base de la valeur? De sorte que je me retrouve avec

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

Je vais avoir un réel état de mort cérébrale moment à ce sujet.

880voto

Nosredna Points 33670

Les déplacer vers un tableau, trier ce tableau, et ensuite utiliser ce tableau pour vos besoins.

Voici une solution que j'ai trouvé via Google:

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 du tableau dans l'ordre que vous voulez, pour ainsi obtenir exactement ce que vous vous apprêtez à faire. Qui fonctionne dans tous les navigateurs, je sais, mais il serait subordonnée à une mise en œuvre caprice, et pourrait se briser à tout moment. Vous ne devriez jamais faire des hypothèses sur l'ordre des éléments dans un objet JavaScript.

474voto

Markus R Points 181

Nous ne voulons pas de dupliquer l'ensemble de la structure de données, 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]})
alert(keysSorted);     // bar,me,you,foo

220voto

inorganik Points 2591

Vos objets peuvent avoir n'importe quelle quantité de propriétés et vous pouvez choisir de trier par quel que soit l'objet de la propriété que vous souhaitez, le nombre ou une chaîne, si vous placez les objets dans un tableau. Envisager cet objet:

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

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

trier par date de naissance, les plus anciens 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/

68voto

Stano Points 2843

Par souci d'exhaustivité, cette fonction retourne un tableau trié de 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.

Mis à jour le violon pour le tri des chaînes est ici. Vous pouvez supprimer les deux autres .toLowerCase() conversions pour la casse de la chaîne de comparaison.

38voto

NickFitz Points 14977

Les objets JavaScript sont non ordonnée par définition (voir le Langage ECMAScript Spécification, section 8.6). Le langage de spécification n'est même pas la garantie que, si vous itérer sur les propriétés d'un objet deux fois de suite, ils vont venir dans le même ordre pour la deuxième fois.

Si vous avez besoin de choses à être commandés, l'utilisation d'une matrice et la Matrice.le prototype.méthode de tri.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X