Objekti.avaimet, arvot, merkinnät

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}

Object.keys/values/entries jättää huomiotta symboliset ominaisuudet

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:

  1. Käytä Object.entries(obj) saadaksemme obj:stä avain/arvoparien joukon.
  2. Käytä array-metodeja tuohon arrayyn, esim. map.
  3. 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.

Vastaa

Sähköpostiosoitettasi ei julkaista.