Obtener una lista de claves de matriz asociativas


258

Tengo una matriz asociativa en Javascript:

var dictionary = {
    "cats": [1,2,3,4,5], 
    "dogs": [6,7,8,9,10]
};

¿Cómo obtengo las claves de este diccionario? es decir, quiero

var keys = ["cats", "dogs"];

Edite 7 años después: solo para obtener la terminología correcta, no existe una 'matriz asociativa' en Javascript, esto es técnicamente solo una objecty son las claves de objeto que queremos.


Manera simple con lodash JS - lodash.com/docs#keys
Programador químico

¡Gracias por aclarar la terminología! ¿Podrías hacer eso un poco más grande con luces rojas parpadeantes?
Joe Phillips

@Joe Lo convertiré en el primer resultado en Google para ti cuando tenga la oportunidad
Simon_Weaver

Respuestas:


84

Puedes usar: Object.keys(obj)

Ejemplo:

var dictionary = {
  "cats": [1, 2, 37, 38, 40, 32, 33, 35, 39, 36],
  "dogs": [4, 5, 6, 3, 2]
};

// Get the keys
var keys = Object.keys(dictionary);

console.log(keys);

Consulte la referencia a continuación para obtener asistencia sobre el navegador. Es compatible con Firefox 4.20, Chrome 5, IE9. El siguiente enlace contiene un fragmento de código que puede agregar si Object.keys()no es compatible con su navegador.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys


Estoy cambiando esto a la respuesta aceptada ahora. Solo IE8 ya no lo admite (para lo cual está disponible un polyfill developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )
Simon_Weaver

382

Prueba esto:

var keys = [];
for (var key in dictionary) {
  if (dictionary.hasOwnProperty(key)) {
    keys.push(key);
  }
}

hasOwnPropertyes necesario porque es posible insertar claves en el objeto prototipo de dictionary. Pero, por lo general, no desea incluir esas claves en su lista.

Por ejemplo, si haces esto:

Object.prototype.c = 3;
var dictionary = {a: 1, b: 2};

y luego haz un for...inbucle dictionary, obtendrás ay b, pero también obtendrás c.


No es necesario declarar "var keys = []", a menos que necesite usarlo después del ciclo.
mzalazar

2
@mzalazar, será mejor que lo hagas o será una variable global, lo cual es una mala práctica.
b00t

@ b00t pensé que al declarar una variable dentro de un bucle for ... no se establecería en el espacio global ... ahora me hizo dudar jeje :)
mzalazar

2
@mzalazar, pero no lo estás declarando ( teclas ) en ningún momento si solo lo estás usando keys.push(key);. Simplemente está tirando (y por lo tanto declarándolo) del espacio de nombres global. :)
b00t

183
for (var key in dictionary) {
  // do something with key
}

Es la declaración for..in .


1
Acabo de notar que debería haber dos puntos en lugar de una coma entre "perros" y la matriz de arriba. Supongamos que se debe a la transcripción.
wombleton

68
Muy importante para comprobar si dictionary.hasOwnProperty(key)de lo contrario puede terminar con los métodos de la cadena de prototipos ..
Tigraine

44
Del mismo artículo: Itera sobre las propiedades enumerables de un objeto, en orden arbitrario . Si el orden de las claves es importante, debe hacer algo como insertarlos en una matriz, ordenarlos y luego usar un bucle for () para obtener claves de la matriz ordenada con las que indexar el objeto original.
mcmlxxxvi

1
Por supuesto, es justo optimizarlo omitiendo el diccionario. HasOwnProperty comprueba si puedes estar seguro de que el objeto carece de un prototipo. Pero es importante ser consciente de la posibilidad de herencia de prototipos en este contexto, ya que los diccionarios JavaScript son realmente objetos.
Fixermark

16

Solo una nota rápida, tenga cuidado de usar for..in si usa una biblioteca (jQuery, prototype, etc.), ya que la mayoría de ellos agregan métodos a los Objetos creados (incluidos los diccionarios).

Esto significará que cuando los recorra, los nombres de los métodos aparecerán como claves. Si está utilizando una biblioteca, mire la documentación y busque una sección enumerable, donde encontrará los métodos correctos para la iteración de sus objetos.


3

Sencilla forma JQUERY.

Esto es lo que uso
DictionaryObj, que es el objeto de diccionario de JavaScript que desea atravesar. valor, por supuesto, la clave son los nombres de ellos en el diccionario.

 $.each(DictionaryObj, function (key, value) {
            $("#storeDuplicationList")
                .append($("<li></li>")
                .attr("value", key)
                .text(value));
        });

1
esto requiere jQuery (lo cual está bien) pero olvidó mencionarlo :-)
Simon_Weaver

@Exzile Los nombres de argumentos en la definición de su función son muy confusos. En api.jquery.com/jquery.each dice que la devolución de llamada es Function (String propertyName, Object valueOfProperty). Tus nombres implican lo contrario.
Chris

@ Chris lo actualizaré por ti. Gracias por señalar eso.
Exzile

0

Actualmente estoy usando la respuesta de Rob de la Cruz

Object.keys(obj)

y en un archivo cargado al principio tengo algunas líneas de código prestadas de otras partes de Internet que cubren el caso de versiones antiguas de intérpretes de guiones que no tienen Object.keys incorporado.

if (!Object.keys) {
    Object.keys = function(object) {
        var keys = [];
        for (var o in object) {
            if (object.hasOwnProperty(o)) {
                keys.push(o);
            }
        }
        return keys;
    };
}

Creo que esto es lo mejor de ambos mundos para proyectos grandes: código moderno simple y soporte compatible con versiones anteriores de navegadores, etc.

Efectivamente, pone la solución de JW en la función cuando Object.keys (obj) de Rob de la Cruz no está disponible de forma nativa.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.