Eu sei que em javascript objetos funcionam como hashes, mas não consegui encontrar uma função incorporada 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 sobre os itens e adicionar as chaves a uma matriz que retorno, mas existe uma maneira mais limpa de fazer isso?
Eu continuo sentindo que deve ser uma função simples que perdi, mas não consigo encontrá-la!
javascript
object
key
Pat
fonte
fonte
Respostas:
Há uma função no JavaScript moderno (ECMAScript 5) chamado
Object.keys
executando esta operação:Detalhes de compatibilidade podem ser encontrados aqui .
No site da Mozilla , também há um trecho de compatibilidade com versões anteriores:
fonte
if(!Object.prototype.keys) Object.prototype.keys = function() { if (this !== Object(this)) throw new TypeError('Object.keys called on non-object'); var ret = [], p; for (p in this) if (Object.prototype.hasOwnProperty.call(this, p)) ret.push(p); return ret; } var x = { a: { A: 1, B: 2, C: 3 }, b: { A: 10, B: 20 } }; alert(x.a.keys());
Object.prototype.keys
farákeys
disponível para todas as sub-classes de objeto, portanto, para todos os objetos. O que provavelmente você deseja se estiver tentando usar o OOP. De qualquer forma, isso realmente depende de suas necessidades.Para código de produção que requer uma 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 novodefineProperty
recurso da ECMA .No ECMAScript 5 - Object.defineProperty
No 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!)No entanto, como o ECMA5 já foi adicionado,
Object.keys
você também pode usar:Resposta original
Edit: Uma vez que esta resposta existe há algum tempo, deixarei o acima exposto intocado. Quem estiver 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 as leva a sempre aparecer em loops for-in que não são usados
hasOwnProperty
. Ainda acho que essa resposta seria ideal se estender o protótipo de Object não fosse tão complicado.fonte
você pode usar
Object.keys
fonte
Você pode usar Underscore.js , que é uma biblioteca de utilitários Javascript.
fonte
Object.prototype
_.keys(obj).length
para ver se existem chaves.É o melhor que você pode fazer, até onde eu sei ...
fonte
Usando o jQuery, você pode obter as chaves assim:
Ou:
graças a @pimlottc
fonte
JQuery.map
:$.map(h, function(v,k) { return k; });
Eu acredito que você pode percorrer as propriedades do objeto usando for / in, para que você possa fazer algo assim:
fonte
Eu queria usar a resposta mais bem avaliada acima
No entanto, ao usar em conjunto com a API do Google Maps v3, o Google Maps não funciona.
funciona bem.
fonte
se você está tentando obter apenas os elementos, mas não as funções, esse código pode ajudá-lo
}
isso faz parte da minha implementação do HashMap e eu quero apenas as chaves,
this
é o objeto hashmap que contém as chavesfonte