Classificando um object JavaScript por nome de propriedade

Eu tenho procurado por um tempo e quero uma maneira de classificar um object JavaScript como este:

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

e ordenar é alfabeticamente por nome para obter:

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

Não consigo encontrar nenhum código que faça isso. Alguém pode me dar alguma ajuda?

Por definição, a ordem das chaves em um object é indefinida , então você provavelmente não será capaz de fazer isso de uma forma que seja à prova do futuro. Em vez disso, você deve pensar em classificar essas chaves quando o object estiver sendo exibido para o usuário. Qualquer que seja a ordem de sorting usada internamente, realmente não importa.

Por convenção, a maioria dos navegadores manterá a ordem das chaves em um object na ordem em que foram adicionados. Então, você poderia fazer isso, mas não espere que sempre funcione:

 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; } 

essa function pega um object e retorna uma matriz ordenada de matrizes no formato [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; } 

A estrutura de dados do object não possui uma ordem bem definida. Em termos matemáticos, a coleção de chaves em um object é um conjunto não ordenado e deve ser tratada como tal. Se você quiser definir a ordem, você DEVE usar uma matriz, porque uma matriz com uma ordem é uma suposição que você pode confiar. Um object com algum tipo de ordem é algo que é deixado para os caprichos da implementação.

Apenas use stringifyify () quando precisar comparar ou dividir os resultados.

 // 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}}) 

Isso deve ser usado com cuidado, pois seu código não deve depender da ordem das propriedades do object. Se é apenas uma questão de apresentação (ou apenas para a diversão!), Você pode classificar as propriedades profundamente assim:

 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; }