Lassen Sie uns von den einzelnen Datenstrukturen weggehen und über die Iterationen über sie sprechen.
Im vorigen Kapitel haben wir die Methoden map.keys()
, map.values()
, map.entries()
gesehen.
Diese Methoden sind generisch, es gibt eine gemeinsame Vereinbarung, sie für Datenstrukturen zu verwenden. Wenn wir jemals eine eigene Datenstruktur erstellen, sollten wir sie auch implementieren.
Sie werden unterstützt für:
Map
Set
Array
Plain-Objekte unterstützen auch ähnliche Methoden, aber die Syntax ist ein wenig anders.
Object.keys, values, entries
Für einfache Objekte sind die folgenden Methoden verfügbar:
- Object.keys(obj) – gibt ein Array von Schlüsseln zurück.
- Object.values(obj) – gibt ein Array von Werten zurück.
- Object.entries(obj) – gibt ein Array von
Paaren zurück.
Bitte beachten Sie die Unterschiede (z.B. im Vergleich zu map):
Map | Objekt | |
---|---|---|
Aufrufsyntax | map.keys() |
Object.keys(obj) , aber nicht obj.keys() |
Returns | iterable | „real“ Array |
Der erste Unterschied ist, dass wir Object.keys(obj)
aufrufen müssen, und nicht obj.keys()
.
Warum das? Der Hauptgrund ist die Flexibilität. Denken Sie daran, dass Objekte die Grundlage aller komplexen Strukturen in JavaScript sind. Wir können also ein eigenes Objekt wie data
haben, das seine eigene Methode data.values()
implementiert. Und wir können immer noch Object.values(data)
darauf aufrufen.
Der zweite Unterschied ist, dass Object.*
-Methoden „echte“ Array-Objekte zurückgeben, nicht nur eine Iterable. Das ist hauptsächlich aus historischen Gründen so.
Zum Beispiel:
let user = { name: "John", age: 30};
Object.keys(user) =
Object.values(user) =
Object.entries(user) = , ]
Hier ist ein Beispiel für die Verwendung von Object.values
, um über Eigenschaftswerte zu schleifen:
let user = { name: "John", age: 30};// loop over valuesfor (let value of Object.values(user)) { alert(value); // John, then 30}
Genauso wie eine for..in
-Schleife ignorieren diese Methoden Eigenschaften, die Symbol(...)
als Schlüssel verwenden.
Gemeinsam ist das praktisch. Aber wenn wir auch symbolische Schlüssel wollen, dann gibt es eine separate Methode Object.getOwnPropertySymbols, die ein Array mit ausschließlich symbolischen Schlüsseln zurückgibt. Außerdem gibt es eine Methode Reflect.ownKeys(obj), die alle Schlüssel zurückgibt.
Transforming objects
Objects fehlen viele Methoden, die für Arrays existieren, z.B. map
, filter
und andere.
Wenn wir sie anwenden wollen, dann können wir Object.entries
gefolgt von Object.fromEntries
verwenden:
- Verwenden Sie
Object.entries(obj)
, um ein Array von Schlüssel/Wert-Paaren ausobj
zu erhalten. - Benutze Array-Methoden für dieses Array, z.B.
map
. - Benutze
Object.fromEntries(array)
für das resultierende Array, um es wieder in ein Objekt zu verwandeln.
Wir haben zum Beispiel ein Objekt mit Preisen und möchten diese verdoppeln:
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
Auf den ersten Blick mag das schwierig aussehen, aber nach ein- oder zweimaliger Anwendung wird es leicht verständlich. Wir können auf diese Weise mächtige Ketten von Transformationen machen.