Poikkeamme yksittäisistä tietorakenteista ja puhumme niiden yli tapahtuvista iteraatioista.
Edellisessä luvussa näimme metodit map.keys()
, map.values()
, map.entries()
.
Nämä metodit ovat geneerisiä, niiden käytöstä tietorakenteiden kohdalla on sovittu yleisesti. Jos joskus luomme oman tietorakenteen, myös ne kannattaa toteuttaa.
Neille on tuki:
Map
Set
Array
Plain-oliot tukevat myös samankaltaisia metodeja, mutta syntaksi on hieman erilainen.
Object.keys, values, entries
Tavallisille objekteille on käytettävissä seuraavat metodit:
- Object.keys(obj) – palauttaa avainten joukon.
- Object.values(obj) – palauttaa arvojen joukon.
- Object.entries(obj) – palauttaa
-parien joukon.
Huomaa erot (verrattuna esimerkiksi mapiin):
Map | Object | |
---|---|---|
Kutsusyntaksi | map.keys() |
Object.keys(obj) , mutta ei obj.keys() |
Returns | iterable | ”real” Array |
Ensimmäinen eroavaisuus on se, että joudumme kutsumaan Object.keys(obj)
eikä obj.keys()
.
Miksi niin? Tärkein syy on joustavuus. Muista, että oliot ovat kaikkien JavaScriptin monimutkaisten rakenteiden perusta. Meillä voi siis olla oma objektimme, kuten data
, joka toteuttaa oman data.values()
-metodinsa. Ja voimme silti kutsua Object.values(data)
sitä.
Toinen ero on se, että Object.*
-metodit palauttavat ”oikeita” array-objekteja, eivät vain iteroitavaa. Tämä on lähinnä historiallisista syistä.
Esimerkiksi:
let user = { name: "John", age: 30};
Object.keys(user) =
Object.values(user) =
Object.entries(user) = , ]
Tässä on esimerkki siitä, kuinka voit käyttää Object.values
:aa silmukan tekemiseen ominaisuuksien arvojen yli:
let user = { name: "John", age: 30};// loop over valuesfor (let value of Object.values(user)) { alert(value); // John, then 30}
Aivan kuten for..in
-silmukka, nämä metodit jättävät huomiotta ominaisuudet, jotka käyttävät Symbol(...)
avaimina.
Se on yleensä kätevää. Mutta jos haluamme myös symbolisia avaimia, on olemassa erillinen metodi Object.getOwnPropertySymbols, joka palauttaa vain symbolisia avaimia sisältävän joukon. Lisäksi on olemassa metodi Reflect.ownKeys(obj), joka palauttaa kaikki avaimet.
Objektien muuntaminen
Objekteista puuttuu monia metodeja, jotka ovat olemassa joukoille, esim. map
, filter
ja muut.
Jos haluamme soveltaa niitä, voimme käyttää Object.entries
ja sen jälkeen Object.fromEntries
:
- Käytä
Object.entries(obj)
saadaksemmeobj
:stä avain/arvoparien joukon. - Käytä array-metodeja tuohon arrayyn, esim.
map
. - Käytä
Object.fromEntries(array)
tuloksena saatuun arrayyn muuttaaksesi sen takaisin objektiksi.
Esimerkiksi meillä on objekti, jossa on hintoja, ja haluaisimme tuplata ne:
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
Se voi näyttää ensisilmäyksellä hankalalta, mutta muuttuu helposti ymmärrettäväksi sen jälkeen, kun sitä on käyttänyt kerran tai kaksi. Voimme tehdä tehokkaita muunnosketjuja tällä tavalla.