Pergunta

Eu sei que em objetos javascript funcionam como hashes, mas não consegui encontrar uma função integrada para obter as chaves

var h = {a:'b',c:'d'};

Eu quero algo como

var k = h.keys() ; // k = ['a','c'];

É simples escrever uma função para iterar os itens e adicionar as chaves a um array que eu retorno, mas existe uma maneira padrão mais limpa de fazer isso?

Continuo sentindo que deve ser uma função simples integrada que perdi, mas não consigo encontrar!

Foi útil?

Solução

Existe uma função no JavaScript moderno (ECMAScript 5) chamada Object.keys realizando esta operação:

var obj = { "a" : 1, "b" : 2, "c" : 3};
alert(Object.keys(obj)); // will output ["a", "b", "c"]

Detalhes de compatibilidade podem ser encontrados aqui.

No Site Mozilla há também um trecho para compatibilidade com versões 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;
}

Outras dicas

Para código de produção que requer grande compatibilidade com navegadores clientes, ainda sugiro a resposta de Ivan Nevostruev acima com shim para garantir Object.keys em navegadores mais antigos.No entanto, é possível obter a funcionalidade exata solicitada usando o novo recurso da ECMA defineProperty recurso.

A partir do ECMAScript 5 - Object.defineProperty

A partir do ECMA5 você pode usar Object.defineProperty() para definir propriedades não enumeráveis.O compatibilidade atual ainda tem muito a desejar, mas eventualmente deverá se tornar utilizável em todos os navegadores.(Observe especificamente a atual incompatibilidade com o 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"]

No entanto, como o ECMA5 já adicionou Object.keys você também pode usar:

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    return Object.keys(this);
  },
  enumerable: false
});

Resposta original

Object.prototype.keys = function ()
{
  var keys = [];
  for(var i in this) if (this.hasOwnProperty(i))
  {
    keys.push(i);
  }
  return keys;
}

Editar: Como essa resposta já existe há algum tempo, deixarei o item acima intocado.Qualquer pessoa que esteja lendo isso também deve ler a resposta de Ivan Nevostruev abaixo.

Não há como tornar as funções de protótipo não enumeráveis, o que faz com que elas sempre apareçam em loops for-in que não usam hasOwnProperty.Ainda acho que essa resposta seria ideal se estender o protótipo do Object não fosse tão complicado.

você pode usar Object.keys

Object.keys(h)

Você poderia usar Sublinhado.js, que é uma biblioteca de utilitários Javascript.

_.keys({one : 1, two : 2, three : 3}); 
// => ["one", "two", "three"]

Isso é o melhor que você pode fazer, até onde eu sei...

var keys = [];
for (var k in h)keys.push(k);

usando jQuery você pode obter as chaves assim:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
var keys = [];
$.each(bobject, function(key,val){ keys.push(key); });
console.log(keys); // ["primary", "bg", "hilite"]

Ou:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
$.map(bobject, function(v,k){return k;});

obrigado a @pimlottc

Eu acredito que você pode percorrer as propriedades do objeto usando for/in, então você poderia fazer algo assim:

function getKeys(h) {
  Array keys = new Array();
  for (var key in h)
    keys.push(key);
  return keys;
}

Eu queria usar a resposta mais bem avaliada acima

Object.prototype.keys = function () ...

No entanto, ao usar em conjunto com a API v3 do Google Maps, o Google Maps não funciona.

for (var key in h) ...

funciona bem.

se você está tentando obter apenas os elementos, mas não as funções, então este código pode ajudá-lo

this.getKeys = function() {

var keys = new Array();
for(var key in this) {

    if( typeof this[key] !== 'function') {

        keys.push(key);
    }
}
return keys;

}

isso faz parte da minha implementação do HashMap e eu só quero as chaves, this é o objeto hashmap que contém as chaves

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top