Digamos que eu crie um objeto assim:
var myObject =
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
Qual é a melhor maneira de recuperar uma lista dos nomes de propriedades? ou seja, eu gostaria de terminar com algumas 'chaves' variáveis, tais como:
keys == ["ircEvent", "method", "regex"]
javascript
johnstok
fonte
fonte
_.keys(myJSONObject)
Respostas:
Nos navegadores modernos (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +), você pode usar o método Object.keys incorporado :
O acima tem um polyfill completo, mas uma versão simplificada é:
Como alternativa, substitua
var getKeys
porObject.prototype.keys
para permitir que você chame.keys()
qualquer objeto. A extensão do protótipo tem alguns efeitos colaterais e eu não recomendaria fazê-lo.fonte
for (var key in myObject) {...}
técnica é útil para tempos de execução de javascript fora dos navegadores e da V8. Por exemplo, ao passar consultas javascript para reduzir o mapa ao Riak, oObject
objeto não existe, portanto, oObject.keys
método não está disponível.Object.keys
método (ECMAScript 5.1) retorna apenas as propriedades do objeto. Eu vejo isso como uma distinção importante.Como slashnick apontou, você pode usar a construção "for in" para iterar sobre um objeto para seus nomes de atributo. No entanto, você estará iterando sobre todos os nomes de atributos na cadeia de protótipos do objeto. Se você deseja iterar apenas sobre os próprios atributos do objeto, poderá usar o método Object # hasOwnProperty () . Assim, tendo o seguinte.
fonte
esc
tecla porque o objeto tinha cerca de um milhão de propriedades, a maioria delas não usada, e eu tinha um alerta.Como Sam Dutton respondeu, um novo método para esse fim foi introduzido no ECMAScript 5th Edition.
Object.keys()
fará o que você deseja e é suportado no Firefox 4 , Chrome 6, Safari 5 e IE 9 .Você também pode implementar muito facilmente o método em navegadores que não o suportam. No entanto, algumas das implementações existentes não são totalmente compatíveis com o Internet Explorer. Aqui está uma solução mais compatível:
Observe que a resposta atualmente aceita não inclui uma verificação de hasOwnProperty () e retornará propriedades herdadas pela cadeia de protótipos. Ele também não é responsável pelo famoso bug DontEnum no Internet Explorer, onde propriedades não enumeráveis na cadeia de protótipos fazem com que propriedades declaradas localmente com o mesmo nome herdem seu atributo DontEnum.
A implementação de Object.keys () fornecerá uma solução mais robusta.
EDIT: após uma discussão recente com kangax , um conhecido colaborador do Prototype, implementei a solução alternativa para o bug DontEnum com base no código para sua
Object.forIn()
função encontrada aqui .fonte
Object.prototype
. No entanto, é comum o código mais curto parecer significativamente mais atraente do que o código maior e mais robusto, mas o objetivo desta resposta é usar o ECMAScript 5thObject.keys()
, que pode ser implementado em navegadores que não suportam esse código. A versão nativa seria ainda mais eficiente que essa.Object.keys
retorna apenas uma matriz de seqüências de caracteres correspondentes às propriedades enumeráveis de um objeto. Isso pode não ser crucial ao trabalhar com objetos nativos (definidos pelo usuário), mas deve ser muito visível com objetos host (embora o comportamento não especificado dos objetos host seja uma história separada - dolorosa). Para enumerar sobre ALL (incluindo não-enumeráveis) propriedades, ES5 ofereceObject.getOwnPropertyNames
(ver o seu apoio na minha compat mesa -. Kangax.github.com/es5-compat-table )Object.keys(stuff)
e nãostuff.keys()
?Observe que Object.keys e outros métodos do ECMAScript 5 são suportados pelo Firefox 4, Chrome 6, Safari 5, IE 9 e superior.
Por exemplo:
Tabela de compatibilidade do ECMAScript 5: http://kangax.github.com/es5-compat-table/
Descrição dos novos métodos: http://markcaudill.com/index.php/2009/04/javascript-new-features-ecma5/
fonte
Object.getOwnPropertyNames(obj)
Essa função também mostra propriedades não enumeráveis, além daquelas mostradas por
Object.keys(obj)
.Em JS, toda propriedade possui algumas propriedades, incluindo um valor booleano
enumerable
.Em geral, propriedades não enumeráveis são mais "internas" e menos usadas, mas é interessante analisá-las algumas vezes para ver o que realmente está acontecendo.
Exemplo:
Observe também como:
Object.getOwnPropertyNames
eObject.keys
não suba a cadeia de protótipos para encontrarbase
for in
fazMais sobre a cadeia de protótipos aqui: https://stackoverflow.com/a/23877420/895245
fonte
Eu sou um grande fã da função de despejo.
http://ajaxian.com/archives/javascript-variable-dump-in-coldfusion
fonte
https://j11y.io/demos/prettyprint/
?Poderia fazê-lo com jQuery da seguinte maneira:
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 chaves
fonte
Isso funcionará na maioria dos navegadores, mesmo no IE8, e nenhuma biblioteca de qualquer tipo é necessária. var i é sua chave.
fonte
Em navegadores que suportam js 1.8:
fonte
A Mozilla tem detalhes completos de implementação sobre como fazê-lo em um navegador onde não é suportado, se isso ajudar:
Você pode incluí-lo como quiser, mas possivelmente em algum tipo de
extensions.js
arquivo na parte superior da sua pilha de scripts.fonte
Usar
Reflect.ownKeys()
Object.keys e Object.getOwnPropertyNames não podem obter propriedades não enumeráveis . Está funcionando mesmo para propriedades não enumeráveis .
fonte
O IE não suporta (i in obj) para propriedades nativas. Aqui está uma lista de todos os acessórios que eu poderia encontrar.
Parece que o stackoverflow faz alguma filtragem estúpida.
A lista está disponível na parte inferior desta postagem do grupo do Google: - https://groups.google.com/group/hackvertor/browse_thread/thread/a9ba81ca642a63e0
fonte
Desde que eu uso underscore.js em quase todos os projetos, usaria a
keys
função:A saída disso será:
fonte
Com base na resposta aceita.
Se o objeto tiver propriedades que você deseja chamar, digamos .properties (), tente!
fonte
A solução funciona nos meus casos e no navegador cruzado:
fonte