Object.keys, values, entries

Odstupme od jednotlivých datových struktur a povězme si něco o iteracích nad nimi.

V předchozí kapitole jsme viděli metody map.keys(), map.values(), map.entries().

Tyto metody jsou obecné, existuje obecná shoda na jejich použití pro datové struktury. Pokud někdy vytvoříme vlastní datovou strukturu, měli bychom je implementovat také.

Jsou podporovány pro:

  • Map
  • Set
  • Array

Podrobné objekty také podporují podobné metody, ale syntaxe je trochu jiná.

Object.keys, values, entries

Pro prosté objekty jsou k dispozici následující metody:

  • Object.keys(obj) – vrací pole klíčů.
  • Object.values(obj) – vrací pole hodnot.
  • Object.entries(obj) – vrací pole dvojic .

Všimněte si prosím rozdílů (ve srovnání například s mapou):

Mapa Objekt
Syntaxe volání map.keys() Object.keys(obj), ale ne obj.keys()
Returns iterable „real“ Array

První rozdíl je v tom, že musíme volat Object.keys(obj), a ne obj.keys().

Proč? Hlavním důvodem je flexibilita. Nezapomeňte, že objekty jsou základem všech složitých struktur v jazyce JavaScript. Můžeme tedy mít vlastní objekt, například data, který implementuje vlastní metodu data.values(). A stále na něm můžeme volat Object.values(data).

Druhý rozdíl spočívá v tom, že metody Object.* vracejí „skutečné“ objekty pole, ne jen iterovatelné. To je hlavně z historických důvodů.

Například:

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

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

Tady je příklad použití Object.values pro procházení hodnot vlastností:

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

Objekt.keys/values/entries ignorují symbolické vlastnosti

Stejně jako smyčka for..in tyto metody ignorují vlastnosti, které jako klíč používají Symbol(...).

Obvykle je to výhodné. Pokud ale chceme i symbolické klíče, pak existuje samostatná metoda Object.getOwnPropertySymbols, která vrací pole pouze symbolických klíčů. Také existuje metoda Reflect.ownKeys(obj), která vrací všechny klíče.

Transformace objektů

Objektům chybí mnoho metod, které existují pro pole, např. map, filter a další.

Pokud je chceme použít, pak můžeme použít Object.entries následovaný Object.fromEntries:

  1. Pomocí Object.entries(obj) získáme z obj pole dvojic klíč/hodnota.
  2. Na toto pole použijeme metody pole, například map.
  3. Na výsledné pole použijeme Object.fromEntries(array), abychom z něj opět udělali objekt.

Například máme objekt s cenami a chtěli bychom je zdvojnásobit:

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

Na první pohled to může vypadat složitě, ale po jednom či dvou použitích to snadno pochopíte. Tímto způsobem můžeme vytvářet silné řetězce transformací.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.