Ordenar objetos JavaScript por clave

Resuelto vdh_ant asked hace 13 años • 0 respuestas

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' }
vdh_ant avatar Mar 29 '11 09:03 vdh_ant
Aceptado

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:

  1. Primero todos los índices de Array, ordenados numéricamente.
  2. Luego, todas las claves de cadena (que no sean índices), en el orden en que fueron creadas.
  3. 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"}'
Expandir fragmento

Úselo varen lugar de constpara compatibilidad con motores ES5.

Mathias Bynens avatar Jun 28 '2015 17:06 Mathias Bynens

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]);
}
Expandir fragmento


Implementación alternativa usando Object.keysfantasí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]);
}
Expandir fragmento


1 No quiero ser pedante, pero no existen los objetos JSON .

Matt Ball avatar Mar 29 '2011 02:03 Matt Ball