2010-05-08 32 views
10

tengo una tabla hash Javascript, así:¿Cómo puedo ordenar una tabla hash en Javascript?

var things = [ ]; 
things["hello"] = {"name" : "zzz I fell asleep", "number" : 7}; 
things["one"] = {"name" : "something", "number" : 18}; 
things["two"] = {"name" : "another thing", "number" : -2}; 

que desea ordenar estos en orden por nombre, por lo que si una iteración en la tabla hash se irá con el fin

another thing 
something 
zzz I fell asleep 

I intentado hacer esto:

function compareThings(thing1, thing2) { 
    var name1 = thing1["name"].toLowerCase(); 
    var name2 = thing2["name"].toLowerCase(); 
    if (name1 < name2) { 
     return -1; 
     } 
    if (name1 > name2) { 
     return 1; 
     } 
    return 0; 
} 

things.sort(compareThings); 

Pero parece que no funciona.

Editar: se me ocurre que quizás una tabla hash ordenada es un oxímoron. Si es así, ¿cuál es la mejor manera de obtener acceso a una lista ordenada de las cosas aquí?

+0

No está teniendo un hastable (también conocido como objeto) ni una matriz adecuada. Si quieres tener un objeto, debes inicializarlo con '{}' no con '[]'. Si inicializas con '[]' tienes una matriz, pero luego no la agregas mediante 'a [" uno "]' y 'a [" dos "]' sino por 'a.push (...); '. Solo después de saber qué estructura de datos desea, ¿puede preocuparse por la clasificación? (Por cierto: 'foo [" bar "]' es lo mismo que 'foo.bar', use el segundo, no obstruye el código con literales de cadena y muchos corchetes) –

Respuesta

16

Si desea iterar a través de una tabla hash en JavaScript en orden, hacer un arreglo, rellenarla con las claves hash, y luego especie eso.

<html> 
<body> 
<pre> 
    <script> 
    var things = new Object(); 
    things["hello"] = {"name" : "zzz I fell asleep", "number" : 7}; 
    things["one"] = {"name" : "something", "number" : 18}; 
    things["two"] = {"name" : "another thing", "number" : -2}; 
    var keys = []; 
    for (var key in things) { 
     if (things.hasOwnProperty(key)) { 
     keys.push(key); 
     } 
    } 
    keys.sort(); 
    for (i in keys) { 
     var key = keys[i]; 
     var value = things[key]; 
     document.write (key +"="+value+"\n"); 
    } 
    </script> 
</pre> 
</body> 
</html> 
+5

Solo una nota, el orden de iteración de la instrucción ['for ... in'] (https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/for...in) puede ser arbitrario, no hay nada descrito en la [especificación ECMAScript] (http://bclary.com/2004/11/07/#a-12.6.4) sobre el orden de enumeración de las propiedades, depende de la implementación ... no hay garantías , use con cuidado ... – CMS

+0

@CMS: Entonces, ¿debería usar 'for (var i = 0; i

+2

@Kinopiko, exactamente, eche un vistazo a los siguientes artículos para obtener más información: [1] (http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/) y [2] (http://www.dhtmlkitchen.com/?category=/JavaScript/&date=2007/10/21/&entry=Iteration-Enumeration-Primitives-and-Objects). – CMS

2

sus parámetros son thing1 y thing2, pero se está haciendo referencia a algunas variables llamadas asp1 y asp2, que, por lo que yo puedo decir de la fuente que ha proporcionado, no existen.

Además, creo que lo que está buscando es una matriz asociativa, que no está instanciada con la sintaxis []. Vea aquí para más información:

http://www.quirksmode.org/js/associative.html

EDIT: no creo que hay una matriz en Javascript que dejaré hacer lo que quiere.

Puede tener una matriz antigua simple, que le permitirá hacer la ordenación personalizada o, puede tener una matriz asociativa, que le permitirá tener los valores nombrados.

Con la matriz regular, puede, obviamente, recorrer los índices.

Con la matriz asociativa, que se pueden recorrer los nombres haciendo for (var key in myArray)

+0

Lo sentimos, error ... – Colen

+1

Be cuidado con eso para ... en sintaxis.Va a recorrer * todas * las propiedades que tiene el objeto en cuestión, que incluye cosas distintas de las teclas de matriz. – Syntactic

+0

^^ Esto es cierto, pero no debería ser un problema siempre que no herede de nada. –

5

Mi solución

things.sort(function(a,b){return a.name - b.name;}); 
+2

OP está utilizando la matriz 'cosas' incorrectamente así que esto no ayudaría. –

+0

Esta respuesta resolvió mi problema. ¡Gracias! – falsarella

4

he desarrollado una función que ordena una tabla hash de la clave, no importa si el valor es un número o una cadena. Mantiene la clave si la tabla es una tabla asociada.

function sortHashTableByKey(hash, key_order, remove_key) 
{ 
    var tmp = [], 
     end = [], 
     f_order = null; 
    remove_key = remove_key || false; 
    for (var key in hash) 
    { 
     if (hash.hasOwnProperty(key)) 
     { 
      tmp.push(hash[key][key_order]); 
     } 
    } 
    if (hash && hash[0] && typeof(hash[0][key_order]) === 'number') 
    { 
     f_order = function (a, b) { return a - b; }; 
    } 
    tmp.sort(f_order); 
    function getHash(hash, value) 
    { 
     for (k in hash) 
     { 
      if (hash[k] && hash[k][key_order] === value) 
      { 
       return { key : k, hash : hash[k] }; 
      } 
     } 
    } 
    for (var i = 0, l = tmp.length; i < l; i++) 
    { 
     tmp[i] = getHash(hash, tmp[i]); 
     if (remove_key) 
     { 
      delete tmp[i].hash[key_order]; 
     } 
     if (!hash.length) 
     { 
      end[tmp[i].key] = tmp[i].hash; 
     } 
     else 
     { 
      end.push(tmp[i].hash); 
     } 
    } 
    return end; 
} 

Esto va a hacer:

var things = new Object(); 
things["hello"] = {"name" : "zzz I fell asleep", "number" : 7}; 
things["one"] = {"name" : "something", "number" : 18}; 
things["two"] = {"name" : "another thing", "number" : -2}; 

things = sortHashTableByKey(things, 'name'); 

/* 
[ 
    two: { name: 'another thing', number: -2 }, 
    one: { name: 'something', number: 18 }, 
    hello: { name: 'zzz I fell asleep', number: 7 } 
] 
*/ 
+1

Planeo ser esto, gracias. –

+0

Esta es exactamente la función que necesito, gracias. – analysiser

+0

@HaykSaakian, ¿cómo va la función? como ser humano, realmente admiro el esfuerzo de cualquier persona para mantener el estado y la función más allá del problema mente/cuerpo. Bravo. – deepelement

Cuestiones relacionadas