Object.keys, values, entries

Lépjünk el az egyes adatstruktúráktól, és beszéljünk a rajtuk végzett iterációkról.

Az előző fejezetben láttuk a map.keys(), map.values(), map.entries() módszereket.

Ezek a módszerek általánosak, közös megegyezés szerint adatstruktúrákra használjuk őket. Ha valaha saját adatszerkezetet hozunk létre, akkor ezeket is implementálnunk kell.

Ezeket támogatják:

  • Map
  • Set
  • Array

A plain objektumok is támogatnak hasonló metódusokat, de a szintaxis kicsit más.

Object.keys, values, entries

A sima objektumok esetében a következő metódusok állnak rendelkezésre:

  • Object.keys(obj) – kulcsok tömbjét adja vissza.
  • Object.values(obj) – értékek tömbjét adja vissza.
  • Object.entries(obj) – párok tömbjét adja vissza.

Kérem, vegye figyelembe a különbségeket (például a map-hoz képest):

Map Object
Call syntax map.keys() Object.keys(obj), de nem obj.keys()
Returns iterable “real” Array

Az első különbség az, hogy nem obj.keys(), hanem Object.keys(obj) kell hívnunk.

Miért? A fő ok a rugalmasság. Ne feledjük, hogy az objektumok minden összetett struktúra alapját képezik a JavaScriptben. Tehát lehet egy saját objektumunk, mint például a data, amely megvalósítja a saját data.values() metódusát. És akkor is meghívhatjuk rajta a Object.values(data)-t.

A második különbség az, hogy a Object.* metódusok “valódi” tömbobjektumokat adnak vissza, nem csak egy iterálhatót. Ez főleg történelmi okokból van.

Például:

let user = { name: "John", age: 30};

  • Object.keys(user) =
  • Object.values(user) =
  • Object.entries(user) = , ]

Itt egy példa a Object.values használatára a tulajdonságértékek körbejárására:

let user = { name: "John", age: 30};// loop over valuesfor (let value of Object.values(user)) { alert(value); // John, then 30}

Object.keys/values/entries figyelmen kívül hagyja a szimbolikus tulajdonságokat

Az for..in ciklushoz hasonlóan ezek a módszerek figyelmen kívül hagyják azokat a tulajdonságokat, amelyek Symbol(...)-t használnak kulcsként.

Ez általában kényelmes. De ha szimbolikus kulcsokat is szeretnénk, akkor van egy külön metódus, az Object.getOwnPropertySymbols, amely egy csak szimbolikus kulcsokat tartalmazó tömböt ad vissza. Emellett létezik egy Reflect.ownKeys(obj) metódus is, amely az összes kulcsot visszaadja.

Objektek átalakítása

A tárgyakból hiányzik sok olyan metódus, amely a tömbökre létezik, pl. map, filter és mások.

Ha ezeket szeretnénk alkalmazni, akkor használhatjuk a Object.entries-et, amelyet Object.fromEntries követ:

  1. A Object.entries(obj) segítségével a obj-ből egy kulcs/érték párokból álló tömböt kaphatunk.
  2. Az így kapott tömbön használjunk tömbmetódusokat, pl. map.
  3. A kapott tömbön használjuk a Object.fromEntries(array)-t, hogy visszaalakítsuk objektummá.

Például van egy objektumunk árakkal, és szeretnénk megduplázni őket:

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

Ez első látásra nehéznek tűnhet, de egyszer-kétszer használat után könnyen érthetővé válik. Erőteljes transzformációs láncokat tudunk így létrehozni.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.