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}
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
:
- Pomocí
Object.entries(obj)
získáme zobj
pole dvojic klíč/hodnota. - Na toto pole použijeme metody pole, například
map
. - 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í.