JavaScript Object.keys, values, entries
Aprenda Object.keys, Object.values, Object.entries e Object.fromEntries em JavaScript com exemplos executáveis: itere objetos com for...of e desestruturação, entenda a ordenação de chaves e compare com métodos Map.
Iterando Sobre Objetos em JavaScript
Os objetos simples são a estrutura preferida do JavaScript para dados de chave-valor, mas ao contrário dos arrays, os objetos não são diretamente iteráveis — você não pode percorrê-los com for...of nem passá-los diretamente para métodos de array como map e filter. Para preencher essa lacuna, o JavaScript fornece três métodos complementares que convertem as propriedades próprias de um object em um array comum:
Object.keys(obj)— um array com os nomes das propriedades.Object.values(obj)— um array com os valores das propriedades.Object.entries(obj)— um array de pares[key, value].
Com a lista de propriedades como array, todas as ferramentas de array ficam disponíveis. Um quarto método, Object.fromEntries, executa o processo inverso, reconstruindo um object a partir de uma lista de pares. Esta página aborda cada método, como iterar de forma limpa com for...of e desestruturação, as regras que determinam a ordem das propriedades e como esses métodos diferem dos equivalentes em um Map.
Os três métodos retornam apenas as propriedades próprias (não herdadas) e enumeráveis com chaves do tipo string. Eles ignoram propriedades herdadas do protótipo e quaisquer chaves do tipo Symbol.
Entendendo o Object.keys
Object.keys(obj) retorna um array com os nomes das propriedades enumeráveis próprias de um dado object. Isso é útil sempre que você precisa contar propriedades, verificar se uma chave existe ou percorrer as chaves.
Exemplo de Uso do Object.keys
Explorando o Object.values
Object.values(obj) retorna um array com os valores das propriedades enumeráveis próprias de um dado object, na mesma ordem que as chaves retornadas por Object.keys.
Exemplo de Uso do Object.values
Utilizando o Object.entries
Object.entries(obj) retorna um array de pares [key, value] com chaves string enumeráveis próprias de um dado object. É o mais flexível dos três porque cada elemento carrega ambas as informações.
Exemplo de Uso do Object.entries
Iterando com for...of e Desestruturação
Como Object.entries retorna um array, você pode percorrê-lo com for...of e desempacotar cada par usando desestruturação. Esta é a maneira mais limpa e legível de percorrer as propriedades de um object:
Você também pode iterar somente as chaves ou somente os valores:
Dica: O
for...ofsobreObject.entriesé preferível a um laçofor...insimples, porque ofor...intambém percorre as propriedades enumeráveis herdadas da cadeia de protótipos, enquantoObject.entriesnão o faz.
Transformando Objetos com Object.fromEntries
Object.fromEntries inverte Object.entries: recebe uma lista de pares [key, value] e constrói um object. Juntos, eles formam uma viagem de ida e volta — transforme um object em pares, processe os pares com métodos de array e depois converta de volta em um object.
Exemplo: Conversão de Ida e Volta
Object.fromEntries também aceita qualquer iterável de pares — incluindo um Map — tornando-o uma maneira rápida de converter um Map em um object simples. Consulte Map e Set para mais informações sobre maps. Ele possibilita conversões sem problemas entre estruturas de array e de object, facilitando um tratamento de dados mais flexível.
Regras de Ordenação de Propriedades
A ordem das chaves retornadas por esses métodos não é arbitrária — o JavaScript segue uma regra definida:
- Chaves semelhantes a inteiros (chaves que parecem inteiros não negativos, ex.:
"1","42") vêm primeiro, ordenadas em ordem numérica crescente. - Chaves string vêm em seguida, na ordem em que foram inseridas.
- Chaves Symbol vêm por último (mas lembre-se de que esses métodos ignoram symbols de qualquer forma).
Esse comportamento de "chaves inteiras são ordenadas" surpreende muitos desenvolvedores:
Se você precisar preservar a ordem de inserção para chaves numéricas, torne as chaves não inteiras — por exemplo, adicionando um prefixo + para que não sejam mais semelhantes a inteiros:
Diferença em Relação aos Métodos do Map
Um Map também possui os métodos keys(), values() e entries(), mas eles se comportam de forma diferente das versões estáticas Object.* em dois aspectos importantes:
- Sintaxe: os métodos do
Mapsão chamados na instância —map.keys()— enquanto os métodos de object são estáticos e recebem o object como argumento —Object.keys(obj). - Tipo de retorno: os métodos do
Mapretornam um iterador (você pode percorrê-lo comfor...of, mas não é um array). Os métodosObject.*sempre retornam um array real, então métodos de array comomap,filterereducefuncionam imediatamente.
Um Map também preserva a ordem de inserção para todas as chaves (incluindo as numéricas) e permite chaves de qualquer tipo, enquanto objetos simples convertem chaves para strings e ordenam chaves semelhantes a inteiros. Quando a ordem de iteração ou chaves não string forem importantes, prefira um Map.
Técnicas Avançadas de Manipulação de Objetos
Filtrando Propriedades de Objetos
Combinar métodos de array com Object.entries e Object.fromEntries possibilita transformações poderosas — como manter apenas as propriedades que passam em um teste.
Exemplo de Filtragem
Mapeando Propriedades de Objetos
Da mesma forma, Object.entries combinado com map permite transformar cada valor (ou chave) e reconstruir o object.
Exemplo de Mapeamento
Conclusão
Object.keys, Object.values e Object.entries são a ponte entre objetos simples e o rico conjunto de ferramentas de array do JavaScript, enquanto Object.fromEntries fecha o ciclo convertendo pares de volta em objetos. Junto com for...of e a desestruturação, eles tornam a iteração, filtragem e transformação de dados em objetos limpa e legível. Tenha em mente as regras de ordenação de propriedades e use um Map quando precisar de ordem de inserção garantida ou chaves não string.