75 votes

Trier un objet JavaScript par nom de propriété

Cela fait un moment que je cherche un moyen de trier un objet Javascript comme ceci :

{
    method: 'artist.getInfo',
    artist: 'Green Day',
    format: 'json',
    api_key: 'fa3af76b9396d0091c9c41ebe3c63716'
}

et trier par ordre alphabétique par nom pour obtenir :

{
    api_key: 'fa3af76b9396d0091c9c41ebe3c63716',
    artist: 'Green Day',
    format: 'json',
    method: 'artist.getInfo'
}

Je ne trouve pas de code qui permette de faire ça. Quelqu'un peut-il me donner de l'aide ?

0 votes

javascriptkit.com/javatutors/arraysort.shtml - Tutoriel décent sur le tri d'objets JS complexes. highdots.com/forums/javascript/re-sorting-json-data-270187.html - Un autre exemple --- Voici une référence complète sur la fonction de tri si vous voulez les détails developer.mozilla.org/fr/Core_JavaScript_1.5_Reference/ -Dernier montage, je le jure !

0 votes

Le problème que je rencontre est que ces articles montrent comment trier un tableau d'objets. J'essaie de trier un objet rempli d'objets. Les mêmes exemples fonctionneront-ils dans mon cas ? Si oui, pouvez-vous me donner un exemple ? Désolé, je suis vraiment bloqué sur ce sujet :s

7 votes

Il s'agit d'une question ancienne, mais je suis un pédant, alors pour la milliardième fois : il n'existe pas d'objet JSON - du moins, pas de la manière dont vous y faites référence. Il y a des objets javascript et des chaînes JSON.

101voto

Chris Nielsen Points 7492

MISE À JOUR des commentaires :

Cette réponse est dépassée. Dans ES6, les clés des objets sont désormais ordonnées. Voir cette question pour un réponse actualisée

Par définition, le l'ordre des clés dans un objet est indéfini Vous ne pourrez donc probablement pas le faire d'une manière qui soit à l'épreuve du temps. Vous devriez plutôt penser à trier ces clés lorsque l'objet est réellement affiché à l'utilisateur. L'ordre de tri utilisé en interne n'a pas vraiment d'importance de toute façon.

Par convention, la plupart des navigateurs conservent l'ordre des clés d'un objet dans l'ordre où elles ont été ajoutées. Vous pouvez donc faire cela, mais ne vous attendez pas à ce que cela fonctionne toujours :

function sortObject(o) {
    var sorted = {},
    key, a = [];

    for (key in o) {
        if (o.hasOwnProperty(key)) {
            a.push(key);
        }
    }

    a.sort();

    for (key = 0; key < a.length; key++) {
        sorted[a[key]] = o[a[key]];
    }
    return sorted;
}

0 votes

Cela semble fonctionner parfaitement. Je vais devoir garder un œil sur le risque de casse dans les futurs navigateurs, mais cela semble fonctionner pour l'instant. Merci pour votre aide :)

0 votes

En fait, cela peut toujours fonctionner, et c'est en train d'être codifié dans la norme Ecmascript, mais ce n'est toujours pas une hypothèse sûre sur laquelle s'appuyer, car avoir un ordre défini ne fait pas logiquement partie d'un "objet". Si vous voulez définir un ordre, vous devez utiliser un tableau.

0 votes

La seule raison pour laquelle j'ai besoin de le faire est de trier les valeurs une fois pour pouvoir générer une signature api comme défini sur cette page dans la section 6 : last.fm/api/webauth Si je l'utilisais pour plus que ça, j'utiliserais un tableau et je le trierais.

13voto

Breton Points 9625

Cette fonction prend un objet et retourne un tableau trié de tableaux de la forme [key,value].

function (o) {
   var a = [],i;
   for(i in o){ 
     if(o.hasOwnProperty(i)){
         a.push([i,o[i]]);
     }
   }
   a.sort(function(a,b){ return a[0]>b[0]?1:-1; })
   return a;
}

La structure de données des objets n'a pas un ordre bien défini. En termes mathématiques, la collection de clés d'un objet est un ensemble non ordonné, et doit être traitée comme tel. Si vous voulez définir un ordre, vous DEVRIEZ utiliser un tableau, car un tableau ayant un ordre est une hypothèse sur laquelle vous pouvez compter. Un objet ayant une sorte d'ordre est quelque chose qui est laissé aux caprices de l'implémentation.

5voto

exebook Points 3156

Il suffit d'utiliser trié stringify() lorsque vous devez comparer ou hacher les résultats.

5voto

steven7mwesigwa Points 97

Voici une phrase pour vous.

let $g = {
    method: 'artist.getInfo',
    artist: 'Green Day',
    format: 'json',
    api_key: 'fa3af76b9396d0091c9c41ebe3c63716'
};

let $w = {};
Object.keys($g).sort().map(i=>$w[i]=$g[i]);
console.log($w);

Bonne chance !

3voto

John Williams Points 769
// if ya need old browser support
Object.keys = Object.keys || function(o) {  
var result = [];  
for(var name in o) {  
    if (o.hasOwnProperty(name))  
      result.push(name);  
}  
    return result;  
};

var o = {c: 3, a: 1, b: 2};
var n = sortem(o);

function sortem(old){
  var newo = {}; Object.keys(old).sort().forEach(function(k) {new[k]=old[k]});
  return newo;
}

// deep
function sortem(old){
  var newo = {}; Object.keys(old).sort().forEach(function(k){ newo[k]=sortem(old[k]) });
  return newo;
}
sortem({b:{b:1,a:2},a:{b:1,a:2}})

0 votes

C'est très joli et astucieux, mais malheureusement Object.keys() n'est pas supporté dans IE<9 et pas non plus dans le mode Quirks de tout IE>=9. Voir Centre de développement IE de MSDN .

0 votes

Ajouté poly fill à la réponse ci-dessus

0 votes

Si vous voulez dire le tri profond de l'obj, j'ai édité la réponse ci-dessus. Le "nouveau" était une faute de frappe.

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