Como encontrar chaves de um hash?

Eu sei em javascript objects duplas como hashes, mas eu tenho sido incapaz de encontrar uma function incorporada para obter as chaves

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

Eu quero algo parecido

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

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

Eu continuo sentindo que deve ser uma function simples que eu perdi, mas não consigo encontrá-lo!

Há uma function no javascript moderno (ECMAScript 5) chamado Object.keys executando 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 da Mozilla, há também um recorte 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; } 

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

A partir do ECMAScript 5 – Object.defineProperty

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

Edit: Uma vez que esta resposta tem sido em torno de um tempo eu vou deixar o acima intocado. Quem ler 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 hasOwnProperty em loops for-in que não usam hasOwnProperty . Eu ainda acho que essa resposta seria ideal se estender o protótipo de Object não fosse tão confuso.

você pode usar Object.keys

 Object.keys(h) 

Você pode usar Underscore.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 object usando para / 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 melhor resposta acima

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

No entanto, quando usado em conjunto com a API do Google Maps v3, o google maps não é funcional.

 for (var key in h) ... 

funciona bem.

Se você está tentando obter apenas os elementos, mas não as funções, 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 object hashmap que contém as chaves

    Intereting Posts