Digamos que tengo una matriz asociativa de Javascript (también conocido como hash, también conocido como diccionario):
var a = new Array();
a['b'] = 1;
a['z'] = 1;
a['a'] = 1;
¿Cómo puedo iterar sobre las claves en orden ordenado? Si ayuda a simplificar las cosas, ni siquiera necesito los valores (todos son solo el número 1).
javascript
Miguel
fuente
fuente
a = {};
.Respuestas:
No puede iterar sobre ellos directamente, pero puede encontrar todas las claves y luego ordenarlas.
Sin embargo, no es necesario convertir la variable 'a' en una matriz. Realmente lo estás usando como un objeto y deberías crearlo así:
fuente
for
bucle siobj.hasOwnProperty(key)
.Puede utilizar el método integrado Object.keys :
(Nota: esto no funciona en navegadores muy antiguos que no son compatibles con EcmaScript5, en particular IE6, 7 y 8. Para obtener estadísticas detalladas y actualizadas, consulte esta tabla )
fuente
if (!Object.keys) { Object.keys = function (obj) { var op, result = []; for (op in obj) { if (obj.hasOwnProperty(op) { result.push(op) } } return result }
incluso podrías crear un prototipo en un objeto:
y el uso:
fuente
key -> value
relación.Estoy de acuerdo con la respuesta de Swingley , y creo que es un punto importante que faltan muchas de estas soluciones más elaboradas. Si solo le preocupan las claves en la matriz asociativa y todos los valores son '1', simplemente almacene las 'claves' como valores en una matriz.
En vez de:
Utilizar:
El único inconveniente de esto es que no puede determinar si una clave específica se configura con la misma facilidad. Vea esta respuesta a la función javascript inArray para obtener una respuesta a ese problema. Un problema con la solución presentada es que
a.hasValue('key')
va a ser un poco más lenta quea['key']
. Eso puede o no importar en su código.fuente
No hay una forma concisa de manipular directamente las "claves" de un objeto Javascript. Realmente no está diseñado para eso. ¿Tiene la libertad de poner sus datos en algo mejor que un objeto normal (o una matriz, como sugiere su código de muestra)?
Si es así, y si su pregunta podría reformularse como "¿Qué objeto similar a un diccionario debería usar si quiero iterar sobre las claves en orden ordenado?" entonces podrías desarrollar un objeto como este:
Si no tiene control sobre el hecho de que los datos están en un objeto regular, esta utilidad convertiría el objeto regular en su diccionario completamente funcional:
Esta fue una definición de objeto (en lugar de una función de constructor reutilizable) por simplicidad; editar a voluntad.
fuente
Obtenga las claves en el primer
for
ciclo, ordénelas, use el resultado ordenado en el segundofor
ciclo.fuente
Puede usar la
keys
función de la biblioteca underscore.js para obtener las claves, luego elsort()
método de matriz para ordenarlas:La
keys
función en el código fuente del guión bajo:fuente
fuente
fuente
Me gusta mucho la idea del prototipo de @ luke-schafer, pero también escucho lo que está diciendo sobre los problemas con los prototipos. ¿Qué hay de usar una función simple?
Esto parece eliminar los problemas con los prototipos y aún proporcionar un iterador ordenado para los objetos. Sin embargo, no soy un gurú de JavaScript, así que me encantaría saber si esta solución tiene fallas ocultas que me perdí.
fuente