Object.keys, valores, entradas

Deixemo-nos afastar das estruturas de dados individuais e falemos das iterações sobre elas.

No capítulo anterior vimos métodos map.keys(), map.values(), map.entries().

Estes métodos são genéricos, há um acordo comum para usá-los para estruturas de dados. Se alguma vez criarmos uma estrutura de dados própria, devemos implementá-los também.

São suportados para:

  • Map
  • Set
  • Array

Objetos planos também suportam métodos similares, mas a sintaxe é um pouco diferente.

Object.keys, valores, entradas

Para objectos simples, os seguintes métodos estão disponíveis:

  • Object.keys(obj) – retorna um array de chaves.
  • Object.values(obj) – retorna um array de valores.
  • Object.entries(obj) – retorna um array de pares.

Por favor note as distinções (comparadas com o mapa por exemplo):

Mapa Objecto
Sintaxe de chamada map.keys() Object.keys(obj), mas não obj.keys()
Retrocede iterável “real” Array

A primeira diferença é que temos de chamar Object.keys(obj), e não obj.keys().

Porquê? A principal razão é a flexibilidade. Lembre-se, objetos são uma base de todas as estruturas complexas em JavaScript. Por isso podemos ter um objecto nosso como data que implementa o seu próprio método data.values(). E ainda podemos chamar Object.values(data) nele.

A segunda diferença é que Object.* métodos retornam objetos de array “reais”, não apenas um iterável. Isso é principalmente por razões históricas.

Por exemplo:

let user = { name: "John", age: 30};

  • Object.keys(user) =
  • Object.values(user) =
  • Object.entries(user) = , ]

Aqui está um exemplo de uso de Object.values para loop sobre valores de propriedades:

let user = { name: "John", age: 30};// loop over valuesfor (let value of Object.values(user)) { alert(value); // John, then 30}

Objecto.chaves/valores/entradas ignoram propriedades simbólicas

Apenas como um laço for..in, estes métodos ignoram propriedades que usam Symbol(...) como chaves.

Usualmente isso é conveniente. Mas se quisermos chaves simbólicas também, então há um método separado Object.getOwnPropertySymbols que retorna um array de apenas chaves simbólicas. Também, existe um método Reflect.ownKeys(obj) que retorna todas as chaves.

Transformar objectos

Objectos carecem de muitos métodos que existem para arrays, por exemplo map, filter e outros.

Se quisermos aplicá-los, então podemos usar Object.entries seguido por Object.fromEntries:

  1. Utilizar Object.entries(obj) para obter uma matriz de pares chave/valor de obj.
  2. Utilizar métodos de array nesse array, por exemplo map.
  3. Utilizar Object.fromEntries(array) no array resultante para transformá-lo novamente em um objeto.

Por exemplo, temos um objecto com preços, e gostaríamos de duplicá-los:

let prices = { banana: 1, orange: 2, meat: 4,};let doublePrices = Object.fromEntries( // convert to array, map, and then fromEntries gives back the object Object.entries(prices).map(() => ));alert(doublePrices.meat); // 8

Pode parecer difícil à primeira vista, mas torna-se fácil de compreender depois de o usar uma ou duas vezes. Podemos fazer cadeias de transformações poderosas desta forma.

Deixe uma resposta

O seu endereço de email não será publicado.