Object.keys, values, entries

Odstupme od jednotlivých datových struktur a promluvme si o iteracích nad nimi.

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

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

Jsou podporovány pro:

  • Map
  • Set
  • Array

Obyčejné objekty také podporují podobné metody, ale syntaxe je trochu jiná.

Objekt.klíče, hodnoty, položky

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) – vrátí pole [key, value] párů.

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

Mapa Objekt
Syntaxe volání map.keys() Object.keys(obj) , ale ne obj.keys()
Vrátí se iterovatelné „skutečné“ pole

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

Proč? Hlavním důvodem je flexibilita. Pamatujte, že objekty jsou základem všech složitých struktur v JavaScriptu. Můžeme tedy mít vlastní objekt jako data který implementuje svůj vlastní data.values() metoda. A stále můžeme volat Object.values(data) na to.

Druhý rozdíl je v tom, že Object.* metody vracejí „skutečné“ objekty pole, nikoli pouze iterovatelné. Je to hlavně z historických důvodů.

Například:

let user = {
 name: "John",
 age: 30
};
  • Object.keys(user) = ["name", "age"]
  • Object.values(user) = ["John", 30]
  • Object.entries(user) = [ ["name","John"], ["age",30] ]

Zde je příklad použití Object.values pro opakování hodnot vlastností:

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

// loop over values
for (let value of Object.values(user)) {
 alert(value); // John, then 30
}
Object.keys/values/entries ignorují symbolické vlastnosti

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

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

Transformace objektů

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

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

  1. Použijte Object.entries(obj) získat pole párů klíč/hodnota z obj .
  2. Použijte na tomto poli metody pole, např. map , k transformaci těchto párů klíč/hodnota.
  3. Použijte Object.fromEntries(array) na výsledném poli, aby se změnilo zpět na objekt.

Máme například objekt s cenami a rádi bychom je zdvojnásobili:

let prices = {
 banana: 1,
 orange: 2,
 meat: 4,
};

let doublePrices = Object.fromEntries(
 // convert prices to array, map each key/value pair into another pair
 // and then fromEntries gives back the object
 Object.entries(prices).map(entry => [entry[0], entry[1] * 2])
);

alert(doublePrices.meat); // 8

Na první pohled to může vypadat složitě, ale po použití jednou nebo dvakrát se to stane snadno pochopitelné. Tímto způsobem můžeme vytvořit mocné řetězce transformací.