Lasciamo perdere le singole strutture dati e parliamo delle iterazioni su di esse.
Nel capitolo precedente abbiamo visto i metodi map.keys()
, map.values()
, map.entries()
.
Questi metodi sono generici, c’è un accordo comune per usarli per le strutture dati. Se mai creassimo una nostra struttura dati, dovremmo implementarli anche noi.
Sono supportati per:
Map
Set
Array
Anche gli oggetti semplici supportano metodi simili, ma la sintassi è leggermente diversa.
Object.keys, values, entries
Per gli oggetti semplici, sono disponibili i seguenti metodi:
- Object.keys(obj) – restituisce un array di chiavi.
- Object.values(obj) – restituisce un array di valori.
- Object.entries(obj) – restituisce un array di coppie
.
Si prega di notare le distinzioni (rispetto a map per esempio):
Map | Object | |
---|---|---|
Sintassi della chiamata | map.keys() |
Object.keys(obj) , ma non obj.keys() |
Returns | iterable | “real” Array |
La prima differenza è che dobbiamo chiamare Object.keys(obj)
, e non obj.keys()
.
Perché? La ragione principale è la flessibilità. Ricordate, gli oggetti sono la base di tutte le strutture complesse in JavaScript. Quindi possiamo avere un oggetto nostro come data
che implementa il proprio metodo data.values()
. E possiamo ancora chiamare Object.values(data)
su di esso.
La seconda differenza è che i metodi Object.*
restituiscono oggetti array “reali”, non solo un iterabile. Questo è principalmente per ragioni storiche.
Per esempio:
let user = { name: "John", age: 30};
Object.keys(user) =
Object.values(user) =
Object.entries(user) = , ]
Ecco un esempio di utilizzo di Object.values
per fare un loop sui valori delle proprietà:
let user = { name: "John", age: 30};// loop over valuesfor (let value of Object.values(user)) { alert(value); // John, then 30}
Proprietà simboliche, come un ciclo for..in
, questi metodi ignorano le proprietà che usano Symbol(...)
come chiavi.
Di solito è comodo. Ma se vogliamo anche le chiavi simboliche, allora c’è un metodo separato Object.getOwnPropertySymbols che restituisce un array di sole chiavi simboliche. Inoltre, esiste un metodo Reflect.ownKeys(obj) che restituisce tutte le chiavi.
Trasformare gli oggetti
Gli oggetti mancano di molti metodi che esistono per gli array, per esempio map
, filter
e altri.
Se vogliamo applicarli, allora possiamo usare Object.entries
seguito da Object.fromEntries
:
- Usa
Object.entries(obj)
per ottenere un array di coppie chiave/valore daobj
. - Utilizza i metodi di array su quell’array, per esempio
map
. - Utilizza
Object.fromEntries(array)
sull’array risultante per trasformarlo nuovamente in un oggetto.
Per esempio, abbiamo un oggetto con dei prezzi, e vorremmo raddoppiarli:
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
Può sembrare difficile a prima vista, ma diventa facile da capire dopo averlo usato una o due volte. Possiamo fare potenti catene di trasformazioni in questo modo.