Digamos que creo un objeto así:
var myObject =
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
¿Cuál es la mejor manera de recuperar una lista de los nombres de propiedad? es decir, me gustaría terminar con algunas 'claves' variables como:
keys == ["ircEvent", "method", "regex"]
javascript
johnstok
fuente
fuente
_.keys(myJSONObject)
Respuestas:
En los navegadores modernos (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +) puede usar el método incorporado Object.keys :
Lo anterior tiene un polyfill completo pero una versión simplificada es:
Alternativamente, reemplace
var getKeys
conObject.prototype.keys
para permitirle llamar.keys()
a cualquier objeto. Extender el prototipo tiene algunos efectos secundarios y no recomendaría hacerlo.fuente
for (var key in myObject) {...}
técnica es útil para tiempos de ejecución de JavaScript fuera de los navegadores y V8. Por ejemplo, al pasar consultas de reducción de mapas de JavaScript a Riak, elObject
objeto no existe, por lo que elObject.keys
método no está disponible.Object.keys
método (ECMAScript 5.1) solo devuelve las propiedades propias del objeto. Lo veo como una distinción importante.Como señaló slashnick , puede usar la construcción "for in" para iterar sobre un objeto para sus nombres de atributo. Sin embargo, iterará sobre todos los nombres de atributos en la cadena de prototipos del objeto. Si desea iterar solo sobre los propios atributos del objeto, puede utilizar el método Object # hasOwnProperty () . Así teniendo lo siguiente.
fuente
esc
tecla porque el objeto tenía aproximadamente un millón de propiedades, la mayoría de ellas no se usaban, y tenía una alerta.Como respondió Sam Dutton, se ha introducido un nuevo método para este mismo propósito en ECMAScript 5th Edition.
Object.keys()
hará lo que quieras y es compatible con Firefox 4 , Chrome 6, Safari 5 e IE 9 .También puede implementar fácilmente el método en navegadores que no lo admiten. Sin embargo, algunas de las implementaciones no son totalmente compatibles con Internet Explorer. Aquí hay una solución más compatible:
Tenga en cuenta que la respuesta actualmente aceptada no incluye una comprobación de hasOwnProperty () y devolverá las propiedades que se heredan a través de la cadena del prototipo. Tampoco tiene en cuenta el famoso error DontEnum en Internet Explorer, donde las propiedades no enumerables en la cadena del prototipo hacen que las propiedades declaradas localmente con el mismo nombre hereden su atributo DontEnum.
Implementar Object.keys () le dará una solución más robusta.
EDITAR: después de una discusión reciente con kangax , un conocido colaborador de Prototype, implementé la solución para el error DontEnum basado en el código para su
Object.forIn()
función que se encuentra aquí .fuente
Object.prototype
. Sin embargo, a menudo es el caso de que el código más corto parece significativamente más atractivo que el código más grande y robusto, pero el objetivo de esta respuesta es usar ECMAScript 5th'sObject.keys()
, que puede implementarse en navegadores que no lo admiten con este código. La versión nativa sería aún más eficaz que esta.Object.keys
solo devuelve una serie de cadenas correspondientes a las propiedades enumerables de un objeto. Esto podría no ser crucial cuando se trabaja con objetos nativos (definidos por el usuario), pero debería ser muy visible con los objetos host (aunque el comportamiento de los objetos host no especificados es una historia separada, dolorosa). Para enumerar sobre TODAS las propiedades (incluidas las no enumerables), ES5 proporcionaObject.getOwnPropertyNames
(consulte su soporte en mi tabla de compatibilidad - kangax.github.com/es5-compat-table )Object.keys(stuff)
y nostuff.keys()
?Tenga en cuenta que Firefox 4, Chrome 6, Safari 5, IE 9 y versiones posteriores admiten Object.keys y otros métodos ECMAScript 5.
Por ejemplo:
Tabla de compatibilidad de ECMAScript 5: http://kangax.github.com/es5-compat-table/
Descripción de nuevos métodos: http://markcaudill.com/index.php/2009/04/javascript-new-features-ecma5/
fuente
Object.getOwnPropertyNames(obj)
Esta función también muestra propiedades no enumerables además de las mostradas por
Object.keys(obj)
.En JS, cada propiedad tiene algunas propiedades, incluida una booleana
enumerable
.En general, las propiedades no enumerables son más "internas" y se usan con menos frecuencia, pero a veces es interesante analizarlas para ver qué sucede realmente.
Ejemplo:
También tenga en cuenta cómo:
Object.getOwnPropertyNames
yObject.keys
no subas a la cadena de prototipos para encontrarbase
for in
haceMás información sobre la cadena de prototipos aquí: https://stackoverflow.com/a/23877420/895245
fuente
Soy un gran fanático de la función de volcado.
http://ajaxian.com/archives/javascript-variable-dump-in-coldfusion
fuente
https://j11y.io/demos/prettyprint/
?Podría hacerlo con jQuery de la siguiente manera:
fuente
si está tratando de obtener solo los elementos pero no las funciones, entonces este código puede ayudarlo
esto es parte de mi implementación de HashMap y solo quiero las claves, "este" es el objeto hashmap que contiene las claves
fuente
Esto funcionará en la mayoría de los navegadores, incluso en IE8, y no se requieren bibliotecas de ningún tipo. var i es tu clave.
fuente
Bajo los navegadores que admiten js 1.8:
fuente
Mozilla tiene detalles completos de implementación sobre cómo hacerlo en un navegador donde no es compatible, si eso ayuda:
Puede incluirlo como desee, pero posiblemente en algún tipo de
extensions.js
archivo en la parte superior de su pila de scripts.fuente
Utilizar
Reflect.ownKeys()
Object.keys y Object.getOwnPropertyNames no pueden obtener propiedades no enumerables . Funciona incluso para propiedades no enumerables .
fuente
IE no admite (i en obj) para propiedades nativas. Aquí hay una lista de todos los accesorios que pude encontrar.
Parece que stackoverflow hace un filtrado estúpido.
La lista está disponible en la parte inferior de esta publicación del grupo de Google: - https://groups.google.com/group/hackvertor/browse_thread/thread/a9ba81ca642a63e0
fuente
Como uso underscore.js en casi todos los proyectos, usaría la
keys
función:La salida de eso será:
fuente
Sobre la base de la respuesta aceptada.
Si el objeto tiene propiedades a las que desea llamar, por ejemplo, .properties () ¡intente!
fuente
La solución funciona en mis casos y en el navegador cruzado:
fuente