Sé que en JavaScript los objetos se duplican como hashes, pero no he podido encontrar una función integrada para obtener las claves
var h = {a:'b',c:'d'};
Quiero algo como
var k = h.keys() ; // k = ['a','c'];
Es simple escribir una función para iterar sobre los elementos y agregar las claves a una matriz que devuelvo, pero ¿hay una forma estándar más limpia de hacerlo?
Sigo sintiendo que debe ser una función incorporada simple que me perdí, ¡pero no puedo encontrarla!
javascript
object
key
Palmadita
fuente
fuente
Respuestas:
Hay una función en JavaScript moderno (ECMAScript 5) llamada
Object.keys
realizar esta operación:Los detalles de compatibilidad se pueden encontrar aquí .
En el sitio de Mozilla también hay un fragmento de compatibilidad con versiones anteriores:
fuente
if(!Object.prototype.keys) Object.prototype.keys = function() { if (this !== Object(this)) throw new TypeError('Object.keys called on non-object'); var ret = [], p; for (p in this) if (Object.prototype.hasOwnProperty.call(this, p)) ret.push(p); return ret; } var x = { a: { A: 1, B: 2, C: 3 }, b: { A: 10, B: 20 } }; alert(x.a.keys());
Object.prototype.keys
estarákeys
disponible para todas las subclases de Object, por lo tanto, para todos los objetos. Lo que probablemente quieras si estás tratando de usar OOP. De todos modos, esto realmente depende de sus requisitos.Para el código de producción que requiere una gran compatibilidad con los navegadores de clientes, sigo sugiriendo la respuesta de Ivan Nevostruev anterior con una cuña para garantizar
Object.keys
en los navegadores más antiguos. Sin embargo, es posible obtener la funcionalidad exacta solicitada utilizando la nuevadefineProperty
función de ECMA .A partir de ECMAScript 5 - Object.defineProperty
A partir de ECMA5 puede usar
Object.defineProperty()
para definir propiedades no enumerables. La compatibilidad actual todavía tiene mucho que desear, pero eventualmente debería ser utilizable en todos los navegadores. (¡Tenga en cuenta específicamente la incompatibilidad actual con IE8!)Sin embargo, dado que ECMA5 ya se agregó,
Object.keys
también podría usar:Respuesta original
Editar: dado que esta respuesta ha estado presente por un tiempo, dejaré la anterior sin tocar. Cualquiera que lea esto también debería leer la respuesta de Ivan Nevostruev a continuación.
No hay forma de hacer que las funciones prototipo no sean enumerables, lo que hace que siempre aparezcan en bucles for-in que no se usan
hasOwnProperty
. Todavía creo que esta respuesta sería ideal si extender el prototipo de Object no fuera tan complicado.fuente
puedes usar
Object.keys
fuente
Puede usar Underscore.js , que es una biblioteca de utilidades de Javascript.
fuente
Object.prototype
_.keys(obj).length
para ver si hay alguna llave.Esto es lo mejor que puedes hacer, que yo sepa ...
fuente
usando jQuery puede obtener las claves de esta manera:
O:
gracias a @pimlottc
fuente
JQuery.map
:$.map(h, function(v,k) { return k; });
Creo que puede recorrer las propiedades del objeto usando for / in, por lo que podría hacer algo como esto:
fuente
Quería usar la respuesta mejor calificada arriba
Sin embargo, cuando se usa junto con la API de Google Maps v3, Google Maps no es funcional.
funciona bien.
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,
this
es el objeto hashmap que contiene las clavesfuente