Ordenar objetos JavaScript por clave
Necesito ordenar objetos JavaScript por clave.
De ahí lo siguiente:
{ 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }
Se convertiría:
{ 'a' : 'dsfdsfsdf', 'b' : 'asdsad', 'c' : 'masdas' }
Las otras respuestas a esta pregunta están desactualizadas, nunca coincidieron con la realidad de la implementación y se han vuelto oficialmente incorrectas ahora que se publicó la especificación ES6/ES2015.
Consulte la sección sobre orden de iteración de propiedades en Exploring ES6 de Axel Rauschmayer :
Todos los métodos que iteran sobre claves de propiedad lo hacen en el mismo orden:
- Primero todos los índices de Array, ordenados numéricamente.
- Luego, todas las claves de cadena (que no sean índices), en el orden en que fueron creadas.
- Luego todos los símbolos, en el orden en que fueron creados.
Entonces sí, los objetos de JavaScript están ordenados y el orden de sus claves/propiedades se puede cambiar.
Así es como puedes ordenar un objeto por sus claves/propiedades, alfabéticamente:
const unordered = {
'b': 'foo',
'c': 'bar',
'a': 'baz'
};
console.log(JSON.stringify(unordered));
// → '{"b":"foo","c":"bar","a":"baz"}'
const ordered = Object.keys(unordered).sort().reduce(
(obj, key) => {
obj[key] = unordered[key];
return obj;
},
{}
);
console.log(JSON.stringify(ordered));
// → '{"a":"baz","b":"foo","c":"bar"}'
Úselo var
en lugar de const
para compatibilidad con motores ES5.
Los objetos JavaScript 1 no están ordenados. No tiene sentido intentar "clasificarlos". Si desea iterar sobre las propiedades de un objeto, puede ordenar las claves y luego recuperar los valores asociados:
var myObj = {
'b': 'asdsadfd',
'c': 'masdasaf',
'a': 'dsfdsfsdf'
},
keys = [],
k, i, len;
for (k in myObj) {
if (myObj.hasOwnProperty(k)) {
keys.push(k);
}
}
keys.sort();
len = keys.length;
for (i = 0; i < len; i++) {
k = keys[i];
console.log(k + ':' + myObj[k]);
}
Implementación alternativa usando Object.keys
fantasía:
var myObj = {
'b': 'asdsadfd',
'c': 'masdasaf',
'a': 'dsfdsfsdf'
},
keys = Object.keys(myObj),
i, len = keys.length;
keys.sort();
for (i = 0; i < len; i++) {
k = keys[i];
console.log(k + ':' + myObj[k]);
}
1 No quiero ser pedante, pero no existen los objetos JSON .