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!

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top