2012-01-06 16 views
242

Me gustaría obtener las claves de un objeto de JavaScript como una matriz, ya sea en jQuery o JavaScript puro.Obtener una matriz de claves del objeto

¿Hay un modo menos detallado que esto?

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' }; 
var keys = []; 
for (var key in foo) { 
    keys.push(key); 
} 
+4

Además de agregar 'if (foo.hasOwnProperty (key))', eso es lo que haría. O bien, use '$ .map'. –

+7

Oh, para un one-liner Pythonic, aunque ... – Richard

+0

una vieja pregunta por lo que no vale la pena una respuesta completa, pero para aquellos que quieran violín ... http://jsfiddle.net/LR5D9/3/ esta solución se ocupa de el problema de las declaraciones de prototipos estropeando 'para var en x' loops – unsynchronized

Respuesta

435
var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' }; 
var keys = Object.keys(foo); // ['alpha', 'beta'] 
// (or maybe some other order, keys are unordered). 

Uso Object.keys.

Esta es una característica ES5. Esto significa que funciona en todos los navegadores modernos, pero will not work in legacy browsers.

El ES5-cuña tiene una implementation of Object.keys you can steal

+5

Nota: Esto solo funciona en navegadores modernos (me refiero a IE <9). –

+2

¿Y qué hay de los navegadores móviles? –

+1

@SmartyTwiti: No estoy seguro. Asumo que sí, como Chrome o Firefox. –

51

Puede usar jQuery's $.map.

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' }, 
keys = $.map(foo, function(v, i){ 
    return i; 
}); 
+2

Esta solución (de Rocket) funciona bien http://jsfiddle.net/KV3RA/3/ – MilkyWayJoe

+2

Me parece que esta solución es mucho mejor si Object.keys() no funciona en IE8 ... – NLemay

5

No sé acerca de menos detallado, pero me inspiré para obligar a la siguiente en una línea por la solicitud de una sola línea, no sé cómo es Pythonic aunque ;)

var keys = (function(o){var ks=[]; for(var k in o) ks.push(k); return ks})(foo); 
+3

Tal vez debería ser 'var enumerableKeysOnThePrototypeChain';) – alex

+1

Tal vez somos lo suficientemente inteligentes como para saber que no tenemos que preocuparnos por hasOwnProperty si el objeto se crea completamente en nuestro ámbito en lugar de ser importado desde otro lugar –

+0

no como pythonic como la segunda respuesta de @ alex ('for (keys [i ++] in foo) {}'), porque todavía estás ejecutando 'Array.push()' (sin mencionar que declaras una función completa). Una implementación pythonic debe basarse tanto en la comprensión implícita como sea posible, y en su defecto, utilizando una expresión lambda. – cowbert

22

Por supuesto, Object.keys() es el mejor manera de conseguir las llaves de un objeto. Si no está disponible en su entorno, puede ser trivial utilizando código como en su ejemplo (excepto que debe tener en cuenta que su ciclo iterará sobre todas las propiedades de la cadena del prototipo, a diferencia del comportamiento de Object.keys()) .

Sin embargo, el código de ejemplo ...

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' }; 
var keys = []; 
for (var key in foo) { 
    keys.push(key); 
} 

jsFiddle.

... podría ser modificado. Puede hacer la tarea directamente en la parte variable.

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' }; 
var keys = [], i = 0; 
for (keys[i++] in foo) {} 

jsFiddle.

Por supuesto, este comportamiento es diferente al que realmente hace Object.keys() (jsFiddle). Simplemente puede usar el shim on the MDN documentation.

+7

Me gustó esto 'var keys = [], i = 0; for (keys [i ++] in foo) {} '+1 – Jashwant

+0

Escuché que" for in "no garantiza el orden, ¿sabe si Object.keys lo hace? –

+0

@ChrisStephens Ninguna orden de garantía, incluso si las claves terminan en una matriz ordenada. – alex

Cuestiones relacionadas