javascript - resolucion - tablas hash c++
¿Cómo encontrar las claves de un hash? (9)
Sé en los objetos de JavaScript dobles como hashes, pero no he podido encontrar una función incorporada para obtener las claves
var h = {a:''b'',c:''d''};
Quiero algo como
var k = h.keys() ; // k = [''a'',''c''];
Es fácil escribir una función para iterar sobre los elementos y agregar las claves a una matriz que devuelvo, pero ¿existe una manera estándar más limpia de hacerlo?
¡Sigo sintiendo que debe ser una función simple incorporada que me perdí pero no puedo encontrarlo!
Creo que puede recorrer las propiedades del objeto usando for / in, por lo que podría hacer algo como esto:
function getKeys(h) {
Array keys = new Array();
for (var key in h)
keys.push(key);
return keys;
}
Esto es lo mejor que puedes hacer, hasta donde yo sé ...
var keys = [];
for (var k in h)keys.push(k);
Hay una función en javascript moderno (ECMAScript 5) llamada Object.keys
realiza 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 here .
En el Object.keys también hay un recorte por 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;
}
Para el código de producción que requiere una gran compatibilidad con los navegadores del cliente, todavía sugiero la respuesta de Ivan Nevostruev anterior con shim para asegurar Object.keys
en los navegadores más antiguos. Sin embargo, es posible obtener la funcionalidad exacta solicitada utilizando la nueva característica defineProperty
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. (¡Observe 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ía 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: Como esta respuesta ha estado disponible por un tiempo, dejaré intacta lo anterior. Cualquiera que lea esto también debe leer la respuesta de Ivan Nevostruev a continuación.
No hay forma de que las funciones de prototipo no sean enumerables, lo que las lleva a aparecer siempre en bucles for-in que no usan hasOwnProperty
. Sigo pensando que esta respuesta sería ideal si ampliar el prototipo de Object no fuera tan desordenado.
Podría usar Underscore.js , que es una biblioteca de utilidades de Javascript.
_.keys({one : 1, two : 2, three : 3});
// => ["one", "two", "three"]
Quería usar la respuesta mejor calificada arriba
Object.prototype.keys = function () ...
Sin embargo, cuando se usa junto con la API v3 de google maps, google maps no funciona.
for (var key in h) ...
funciona bien.
puedes usar Object.keys
Object.keys(h)
si intentas obtener los elementos solamente pero no las funciones, entonces este código puede ayudarte
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
usando jQuery puedes obtener las claves de esta manera:
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