Să ne îndepărtăm de structurile de date individuale și să vorbim despre iterațiile peste ele.
În capitolul anterior am văzut metodele map.keys()
, map.values()
, map.entries()
.
Aceste metode sunt generice, există un acord comun de a le folosi pentru structurile de date. Dacă vom crea vreodată o structură de date proprie, ar trebui să le implementăm și pe acestea.
Ele sunt suportate pentru:
Map
Set
Array
Obiectele de tip Plain suportă, de asemenea, metode similare, dar sintaxa este un pic diferită.
Object.keys, values, entries
Pentru obiectele simple, sunt disponibile următoarele metode:
- Object.keys(obj) – returnează un tablou de chei.
- Object.values(obj) – returnează un tablou de valori.
- Object.entries(obj) – returnează un tablou de perechi
.
Rețineți distincțiile (în comparație cu map de exemplu):
Map | Object | ||
---|---|---|---|
Sintaxa apelului | map.keys() |
Object.keys(obj) , dar nu obj.keys() |
|
Returns | iterable | „real” Array |
Prima diferență este că trebuie să apelăm Object.keys(obj)
, și nu obj.keys()
.
De ce așa? Motivul principal este flexibilitatea. Amintiți-vă că obiectele sunt o bază a tuturor structurilor complexe din JavaScript. Așadar, putem avea un obiect propriu, cum ar fi data
, care își implementează propria metodă data.values()
. Și tot putem apela Object.values(data)
asupra lui.
A doua diferență este că metodele Object.*
returnează obiecte array „reale”, nu doar un iterabil. Acest lucru este în principal din motive istorice.
De exemplu:
let user = { name: "John", age: 30};
Object.keys(user) =
Object.values(user) =
Object.entries(user) = , ]
Iată un exemplu de utilizare a Object.values
pentru a trece în buclă peste valorile proprietăților:
let user = { name: "John", age: 30};// loop over valuesfor (let value of Object.values(user)) { alert(value); // John, then 30}
La fel ca o buclă for..in
, aceste metode ignoră proprietățile care folosesc Symbol(...)
ca și chei.
De obicei, acest lucru este convenabil. Dar dacă vrem și chei simbolice, atunci există o metodă separată Object.getOwnPropertySymbols care returnează o matrice numai de chei simbolice. De asemenea, există o metodă Reflect.ownKeys(obj) care returnează toate cheile.
Transformarea obiectelor
Obiectelor le lipsesc multe metode care există pentru array-uri, de ex. , filter
și altele.
Dacă dorim să le aplicăm, atunci putem folosi Object.entries
urmată de Object.fromEntries
:
- Utilizați
Object.entries(obj)
pentru a obține un array de perechi cheie/valoare dinobj
. - Utilizați metodele array pe acel array, de exemplu
map
. - Utilizați
Object.fromEntries(array)
pe array-ul rezultat pentru a-l transforma din nou într-un obiect.
De exemplu, avem un obiect cu prețuri și dorim să le dublăm:
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
Acesta poate părea dificil la prima vedere, dar devine ușor de înțeles după ce îl folosiți o dată sau de două ori. Putem face lanțuri puternice de transformări în acest fel.
.