Obtendo uma lista de chaves de matriz associativas


258

Eu tenho uma matriz associativa em Javascript:

var dictionary = {
    "cats": [1,2,3,4,5], 
    "dogs": [6,7,8,9,10]
};

Como obtenho as chaves deste dicionário? ie eu quero

var keys = ["cats", "dogs"];

Edite 7 anos depois: Apenas para corrigir a terminologia - não existe uma 'matriz associativa' em Javascript - isso é tecnicamente apenas um objecte são as chaves de objeto que queremos.


Maneira simples com JS lodash - lodash.com/docs#keys
Chemical programador

Obrigado por esclarecer a terminologia! Você pode aumentar um pouco as luzes vermelhas brilhantes?
21818 Joe Phillips

@ Joe Eu vou fazer isso o primeiro resultado no Google para você quando eu tiver uma chance
Simon_Weaver

Respostas:


84

Você pode usar: Object.keys(obj)

Exemplo:

var dictionary = {
  "cats": [1, 2, 37, 38, 40, 32, 33, 35, 39, 36],
  "dogs": [4, 5, 6, 3, 2]
};

// Get the keys
var keys = Object.keys(dictionary);

console.log(keys);

Consulte a referência abaixo para suporte ao navegador. É suportado no Firefox 4.20, Chrome 5, IE9. O link abaixo contém um trecho de código que você pode adicionar se Object.keys()não houver suporte no seu navegador.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys


Estou mudando isso para a resposta aceita agora. Somente o IE8 não é mais suportado (para o qual um polyfill está disponível developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/… )
Simon_Weaver

382

Tente o seguinte:

var keys = [];
for (var key in dictionary) {
  if (dictionary.hasOwnProperty(key)) {
    keys.push(key);
  }
}

hasOwnPropertyé necessário porque é possível inserir chaves no objeto protótipo de dictionary. Mas você normalmente não deseja que essas chaves sejam incluídas na sua lista.

Por exemplo, se você fizer isso:

Object.prototype.c = 3;
var dictionary = {a: 1, b: 2};

e depois faça um for...inloop dictionary, você obterá ae b, mas também obterá c.


Não é necessário declarar "var keys = []", a menos que você precise usá-lo após o loop.
Mzalazar 3/09/14

2
@ mzalazar, é melhor você fazer ou será uma variável global, o que é uma prática ruim.
b00t

@ b00t i no entanto, que ao declarar uma variável dentro de um loop for ... é wouln't ser definido no espaço global ... agora você me fez duvidar hehe :)
mzalazar

2
@mzalazar, mas você não está declarando ( chaves ) a qualquer momento, se estiver apenas usando keys.push(key);. Você está apenas puxando (e assim declarando) do espaço para nome global. :)
b00t

183
for (var key in dictionary) {
  // do something with key
}

É a declaração for..in .


1
Só notei que deveria haver dois pontos em vez de vírgula entre "cães" e a matriz acima. Suponha que seja devido à transcrição.
Wombleton 18/02/09

68
Muito importante para verificar se há dictionary.hasOwnProperty(key)caso contrário você pode acabar com métodos da cadeia de protótipos ..
Tigraine

4
Do mesmo artigo: itera sobre as propriedades enumeráveis ​​de um objeto, em ordem arbitrária . Se a ordem das chaves é importante, você precisa fazer algo como empurrá-las em uma matriz, classificá-las e, em seguida, usar um loop for () para obter as chaves da matriz classificada com a qual indexar o objeto original.
mcmlxxxvi

1
Obviamente, é justo otimizar omitindo o dictionary.hasOwnProperty verifica se você pode ter certeza de que o objeto não possui um protótipo. Mas é importante estar ciente da possibilidade de herança de protótipo nesse contexto, pois os dicionários JavaScript são realmente objetos.
Fixermark

16

Apenas uma observação rápida, tenha cuidado ao usar for..in se você usar uma biblioteca (jQuery, protótipo etc.), pois a maioria deles adiciona métodos aos objetos criados (incluindo dicionários).

Isso significa que, quando você fizer um loop sobre eles, os nomes dos métodos aparecerão como chaves. Se você estiver usando uma biblioteca, consulte a documentação e procure uma seção enumerável, onde encontrará os métodos certos para a iteração de seus objetos.


3

Maneira JQUERY simples.

É isso que eu uso
DictionaryObj, sendo o objeto de dicionário javascript que você deseja passar. chave, é claro que os nomes deles estão no dicionário.

 $.each(DictionaryObj, function (key, value) {
            $("#storeDuplicationList")
                .append($("<li></li>")
                .attr("value", key)
                .text(value));
        });

1
isso exige jQuery (que é bom), mas você se esqueceu de mencioná-lo :-)
Simon_Weaver

@ Exzile Os nomes dos argumentos na sua definição de função são muito confusos. Diz em api.jquery.com/jquery.each que o retorno de chamada é Function (String propertyName, Object valueOfProperty). Seus nomes implicam o contrário.
Chris

@ Chris Vou atualizar isso para você. Obrigado por apontar isso.
Exzile

0

Atualmente, estou usando a resposta de Rob de la Cruz

Object.keys(obj)

e em um arquivo carregado no início, tenho algumas linhas de código emprestadas de outras partes da Internet que cobrem o caso de versões antigas de interpretadores de script que não possuem Object.keys embutidas.

if (!Object.keys) {
    Object.keys = function(object) {
        var keys = [];
        for (var o in object) {
            if (object.hasOwnProperty(o)) {
                keys.push(o);
            }
        }
        return keys;
    };
}

Eu acho que esse é o melhor dos dois mundos para grandes projetos: código moderno simples e suporte compatível com versões anteriores de versões antigas de navegadores etc.

Efetivamente, coloca a solução de JW na função quando Object.keys (obj) de Rob de la Cruz não está disponível nativamente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.