2011-06-07 17 views
8

Si tengo este JS objeto literal:Cómo ordenar un objeto JS Literal?

var foo = { 
    Sussy: 4, 
    Billy: 5, 
    Jimmy: 2, 
    Sally: 1 
}; 

¿Cómo puedo crear un objeto nuevo, ordenados literal:

var bar = { 
    Sally: 1, 
    Jimmy: 2, 
    Sussy: 4, 
    Billy: 5 
}; 
+1

No puede ordenar un Objeto JS como se muestra en su pregunta. Imposible. ¿Por qué? Porque las propiedades del objeto JS no están ordenadas. Cambiar a una matriz. Las matrices están ordenadas, los objetos no. –

Respuesta

9

Re: ¿Cómo ordenar un objeto JS?

Respuesta: No se puede. Entonces, en cambio, necesitas una estructura de datos más sofisticada. Tiene muchas opciones:

  1. Puede usar una matriz separada para mantener el orden de las teclas del objeto. (Esto es lo que demuestra la respuesta de @Felix Kling.) Bueno: recuperación rápida por orden o nombre. Malo: necesita una segunda estructura de datos que debe mantenerse sincronizada con la primera.
  2. En lugar de que el Objeto simplemente tenga propiedades y valores, las propiedades podrían contener Objetos que contienen los valores y un orden de clasificación. Bueno: 1 estructura de datos. Búsqueda rápida por nombre de propiedad. Malo: búsqueda lenta por orden (necesita escanear la estructura). Clasificación lenta.
  3. Utilice una matriz, con elementos que constan de objetos que contienen la clave y el valor. Bueno: 1 estructura de datos. Búsqueda rápida por orden. Clasificación rápida. Malo: búsqueda lenta por nombre de propiedad (necesidad de escanear la estructura).

Recomiendo la solución 3 ya que utiliza la mecánica JS para gestionar el pedido.

Ejemplos:

// Object holds sort order: (Solution 2) 
var foo = { 
    Suzy: {v: 4, order: 0}, 
    Billy: {v: 5, order: 1}, 
    Jimmy: {v: 2, order: 2}, 
    Sally: {v: 1, order: 3} 
};  

// Array holds keys: (Solution 3) 
var woof = [ 
    {k: 'Suzy', v: 4}, 
    {k: 'Billy', v: 5}, 
    {k: 'Jimmy', v: 2}, 
    {k: 'Sally', v: 1} 
]; 

// Sort the woof array by the key names: 
woof.sort(function(a, b) { 
    return a.k.localeCompare(b.k); 
}); 

// The third key and value: 
woof[2].k; // the third key 
woof[2].v; // the third value 

Editado: código actualizado para corregir error tipográfico. Gracias, @Martin Fido

+0

+1 Me gusta la tercera opción también :) –

+0

Gracias por ponerme en el camino correcto y todos los detalles. Voy a intentar el # 3. – edt

+1

@ LarryK - me ayudó en un atasco. Gracias. – dopatraman

6

propiedades de los objetos están en ningún orden específico (el orden depende de la implementación) y no puedes ordenar las propiedades.

usted tiene que mantener una matriz de claves y ordenar en consecuencia, por ejemplo:

var keys = []; 

for(var key in obj) { 
    if(obj.hasOwnProperty(key)) { 
     keys.push(key); 
    } 
} 

keys.sort(function(a, b) { 
    return obj[a] - obj[b]; 
}); 

ya se puede iterar sobre los valores de la matriz y utilizarlos para acceder a la propiedad correspondiente del objeto.

Cuestiones relacionadas