web-dev-qa-db-fra.com

Tri d'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 est alphabétiquement par nom pour obtenir:

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

Je ne trouve aucun code qui puisse faire cela. Est-ce que quelqu'un peut m'aider?

52
matto1990

Par définition, l'ordre des clés dans un objet n'est pas défini , vous ne pourrez donc probablement pas le faire de manière à ce qu'il soit à l'avenir. Au lieu de cela, vous devriez penser à trier ces clés lorsque l'objet est réellement affiché à l'utilisateur. Quel que soit l'ordre de tri utilisé en interne, cela n'a pas vraiment d'importance.

Par convention, la plupart des navigateurs conservent l'ordre des clés dans un objet dans l'ordre dans lequel elles ont été ajoutées. Donc, vous pouvez le faire, mais ne vous attendez pas à ce qu'il 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;
}
84
Chris Nielsen

cette fonction prend un objet et retourne un tableau trié de tableaux de la forme [clé, valeur]

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 d'objet n'a pas un ordre bien défini. En termes mathématiques, la collection de clés dans un objet est un ensemble non ordonné et doit être traitée comme telle . Si vous voulez définir un ordre, vous DEVRIEZ utiliser un tableau, car un tableau ayant un ordre est une hypothèse que vous pouvez compter sur. Un objet ayant une sorte d'ordre est laissé aux caprices de la mise en œuvre.

12
Breton

Utilisez simplement trié stringify () lorsque vous avez besoin de comparer ou de hacher les résultats.

5
exebook
// 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}})
3
John Williams

Cela doit être utilisé avec prudence, car votre code ne doit pas s'appuyer sur l'ordre des propriétés d'objet. Si c'est juste une question de présentation (ou juste pour le plaisir!), Vous pouvez trier les propriétés profondément comme ceci:

function sortObject(src) {
  var out;
  if (typeof src === 'object' && Object.keys(src).length > 0) {
    out = {};
    Object.keys(src).sort().forEach(function (key) {
      out[key] = sortObject(src[key]);
    });
    return out;
  }
  return src;
}
0
Pierre Maoui