¿Cómo encontrar claves de un hash?
-
09-06-2019 - |
Pregunta
Sé que en JavaScript los objetos funcionan 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 sencillo escribir una función yo mismo para iterar sobre los elementos y agregar las claves a una matriz que devuelvo, pero ¿existe 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!
Solución
Hay una función en JavaScript moderno (ECMAScript 5) llamada Object.keys
realizando esta operación:
var obj = { "a" : 1, "b" : 2, "c" : 3};
alert(Object.keys(obj)); // will output ["a", "b", "c"]
Los detalles de compatibilidad se pueden encontrar aquí.
Sobre el Sitio Mozilla También hay un fragmento de compatibilidad con versiones anteriores:
if(!Object.keys) Object.keys = function(o){
if (o !== Object(o))
throw new TypeError('Object.keys called on non-object');
var ret=[],p;
for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);
return ret;
}
Otros consejos
Para el código de producción que requiere una gran compatibilidad con los navegadores de los clientes, todavía sugiero la respuesta anterior de Ivan Nevostruev con shim para garantizar Object.keys
en navegadores más antiguos.Sin embargo, es posible obtener la funcionalidad exacta solicitada utilizando el nuevo ECMA. defineProperty
característica.
A partir de ECMAScript 5 - Object.defineProperty
A partir de ECMA5 puedes usar Object.defineProperty()
para definir propiedades no enumerables.El compatibilidad actual Todavía tiene mucho que desear, pero eventualmente debería poder utilizarse en todos los navegadores.(¡Tenga en cuenta específicamente la incompatibilidad actual con IE8!)
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
var keys = [];
for(var i in this) if (this.hasOwnProperty(i)) {
keys.push(i);
}
return keys;
},
enumerable: false
});
var o = {
'a': 1,
'b': 2
}
for (var k in o) {
console.log(k, o[k])
}
console.log(o.keys())
# OUTPUT
# > a 1
# > b 2
# > ["a", "b"]
Sin embargo, dado que ECMA5 ya agregó Object.keys
también podrías usar:
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
return Object.keys(this);
},
enumerable: false
});
Respuesta original
Object.prototype.keys = function ()
{
var keys = [];
for(var i in this) if (this.hasOwnProperty(i))
{
keys.push(i);
}
return keys;
}
Editar: Dado que esta respuesta existe desde hace un tiempo, dejaré lo anterior intacto.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 utilizan hasOwnProperty
.Sigo pensando que esta respuesta sería ideal si ampliar el prototipo de Object no fuera tan complicado.
puedes usar Object.keys
Object.keys(h)
Podrías usar Subrayado.js, que es una biblioteca de utilidades Javascript.
_.keys({one : 1, two : 2, three : 3});
// => ["one", "two", "three"]
Esto es lo mejor que puedes hacer, hasta donde yo sé...
var keys = [];
for (var k in h)keys.push(k);
usando jQuery puedes obtener las claves así:
var bobject = {primary:"red",bg:"maroon",hilite:"green"};
var keys = [];
$.each(bobject, function(key,val){ keys.push(key); });
console.log(keys); // ["primary", "bg", "hilite"]
O:
var bobject = {primary:"red",bg:"maroon",hilite:"green"};
$.map(bobject, function(v,k){return k;});
gracias a @pimlottc
Creo que puedes recorrer las propiedades del objeto usando for/in, por lo que podrías hacer algo como esto:
function getKeys(h) {
Array keys = new Array();
for (var key in h)
keys.push(key);
return keys;
}
Quería usar la respuesta mejor calificada arriba.
Object.prototype.keys = function () ...
Sin embargo, cuando se utiliza junto con la API v3 de Google Maps, Google Maps no funciona.
for (var key in h) ...
funciona bien.
Si está intentando obtener solo los elementos pero no las funciones, entonces este código puede ayudarlo
this.getKeys = function() {
var keys = new Array();
for(var key in this) {
if( typeof this[key] !== 'function') {
keys.push(key);
}
}
return keys;
}
esto es parte de mi implementación de HashMap y solo quiero las claves, this
es el objeto hashmap que contiene las claves