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}
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
:
- Utilizar
Object.entries(obj)
para obter uma matriz de pares chave/valor deobj
. - Utilizar métodos de array nesse array, por exemplo
map
. - 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.