Tri d'un objet JavaScript par nom de propriété
j'ai cherché pendant un certain temps et je veux un moyen de trier un objet Javascript comme ceci:
{
method: 'artist.getInfo',
artist: 'Green Day',
format: 'json',
api_key: 'fa3af76b9396d0091c9c41ebe3c63716'
}
et le tri est alphabétique par nom pour obtenir:
{
api_key: 'fa3af76b9396d0091c9c41ebe3c63716',
artist: 'Green Day',
format: 'json',
method: 'artist.getInfo'
}
Je ne trouve pas de code pour faire ça. Quelqu'un peut-il me donner un peu d'aide?
5 réponses
par définition, le l'ordre des clés dans un objet n'est pas défini , donc vous ne serez probablement pas en mesure de le faire d'une manière qui est à l'épreuve du futur. Au lieu de cela, vous devriez penser à trier ces touches lorsque l'objet est affiché à l'utilisateur. Quel que soit l'ordre de tri utilisé en interne, ça n'a pas vraiment d'importance de toute façon.
Par convention, la plupart des navigateurs de conserver l'ordre des clés dans un objet dans l'ordre de leur ont été ajoutés. Donc, vous pouvez le faire, mais ne vous attendez pas à 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;
}
cette fonction prend un objet et renvoie un tableau trié de matrices 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 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é comme tel. Si vous voulez définir l'ordre, vous devriez utiliser un tableau, parce qu'un tableau ayant un ordre est une hypothèse sur laquelle vous pouvez compter. Un objet ayant une certaine forme d'ordre est quelque chose qui est laissée à la libre appréciation de la mise en œuvre.
il suffit d'utiliser tried stringify () lorsque vous devez comparer ou hachez les résultats.
// 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}})
ceci doit être utilisé avec prudence car votre code ne devrait pas dépendre de l'ordre des propriétés de l'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;
}