2012-10-08 28 views
6

Duplicar posible:
How to sort an associative array by its values in Javascript?¿Cómo ordenar una matriz (asociativa) por valor?

Así que antes que nada sé técnicamente Javascript no tiene matrices asociativas, pero no estaba seguro de cómo titularlo y obtener la idea correcta en todo .

Así que aquí es el código que tengo,

var status = new Array(); 
status['BOB'] = 10 
status['TOM'] = 3 
status['ROB'] = 22 
status['JON'] = 7 

y quiero ordenar por valor tal que cuando bucle a través de él más adelante ROB es lo primero, y luego BOB, etc.

I Lo he intentado,

status.sort() 
status.sort(function(a, b){return a[1] - b[1];}); 

Pero ninguno de ellos parece realmente HACER nada.

Al imprimir la matriz en la consola antes y después, resulta que sale en el mismo orden.

+4

Ese es el mal uso de las matrices de JS. Solo use teclas numéricas con matrices. '.sort' no hace nada porque estrictamente hablando su matriz no tiene ningún elemento. Tienes que usar objetos en este caso. Recomiendo leer [MDN - Trabajar con objetos] (https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Working_with_Objects). –

+2

También: [Ordenando objeto JavaScript por valor de propiedad] (http://stackoverflow.com/questions/1069666/sorting-javascript-object-by-property-value). –

+0

Aunque se marcó como duplicado, la (s) solución (es) presentada (s) a continuación no se mencionan en el duplicado. – PopeJohnPaulII

Respuesta

21

Las matrices solo pueden tener índices numéricos. Debería volver a escribir esto como un Objeto o como una Matriz de Objetos.

var status = new Object(); 
status['BOB'] = 10 
status['TOM'] = 3 
status['ROB'] = 22 
status['JON'] = 7 

o

var status = new Array(); 
status.push({name: 'BOB', val: 10}); 
status.push({name: 'TOM', val: 3}); 
status.push({name: 'ROB', val: 22}); 
status.push({name: 'JON', val: 7}); 

Si te gusta el método status.push, puede ordenar con:

status.sort(function(a,b) { 
    return a.val - b.val; 
}); 
+0

Me gusta este enfoque (Array), ¿cuál sería la manera correcta de llamar y ordenar por 'val'? – PopeJohnPaulII

+0

He actualizado mi respuesta para incluir la clasificación por 'val' con una matriz de objetos. – saml

+0

Solución genial y simple. – Ahsan

2

Primera - Es incorrecto para crear una matriz de utilizarlo como una asignación. En lugar de utilizar Objeto:

var status = {}; 
status['BOB'] = 10; 

la matriz es una clase con la lógica de manejar índices numéricos-secuencial.

Ahora respondiendo a su respuesta, Asignaciones no tienen fin, no hay ninguna garantía sobre el orden en que se repetirá lo que no hay tal cosa como "clasificación de un mapeo"

I sugest utilizar una matriz con los objetos con clave, valor:

var status = []; 
status.push({ key: 'BOB', value: 10 }); 

o dos matrices:

var status = { 
    keys: [], 
    values: [] 
}; 
status.keys.push('BOB'); 
status.value.push(10); 

Todo depende de sus necesidades.

1

Debe utilizar JavaScript objeto dentro de la matriz: jsfidle

 var status = new Array(); 
    status.push({key: 'BOB', value: 10}); 
    status.push({key: 'TOM', value: 3}); 
    status.push({key: 'ROB', value: 22}); 
    status.push({key: 'JON', value: 7}); 
    status.sort(function(a, b){ 

     if(a.value > b.value){ 
     return -1; 
     } 
     else if(a.value < b.value){ 
     return 1; 
     } 
     return 0; 
    }); 
+0

Esto es bueno para la comparación de cadenas – cw24

2

"matrices" en javascript son indexado numéricamente. Los "objetos" son lo que usted llamaría matriz asociativa. Los "objetos" son inherentemente desordenados.

Para hacer esto, necesitarás cambiar un poco la estructura de datos.

var arr = []; // Array 

// push a few objects to the array. 
arr.push({name: 'BOB', age: 10}); 
arr.push({name: 'TOM', age: 3}); 
arr.push({name: 'ROB', age: 22}); 
arr.push({name: 'JON', age: 7}); 

var sorted = arr.sort(function(a, b) { 
    return a.age - b.age; 
}); 

console.log(sorted); 

enter image description here

+0

¿Cómo ordenarlo por su nombre? –

Cuestiones relacionadas