Object.keys, values, entries

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}

Oggetto.keys/values/entries ignora le proprietà simboliche

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:

  1. Usa Object.entries(obj) per ottenere un array di coppie chiave/valore da obj.
  2. Utilizza i metodi di array su quell’array, per esempio map.
  3. 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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.