Vi kan ta ett steg bort från de enskilda datastrukturerna och prata om iterationer över dem.
I föregående kapitel såg vi metoderna map.keys()
, map.values()
, map.entries()
.
De här metoderna är generiska, det finns en gemensam överenskommelse om att använda dem för datastrukturer. Om vi någonsin skapar en egen datastruktur bör vi implementera dem också.
De stöds för:
Map
Set
Array
Plain objects stödjer också liknande metoder, men syntaxen är lite annorlunda.
Object.keys, values, entries
För vanliga objekt finns följande metoder:
- Object.keys(obj) – returnerar en matris med nycklar.
- Object.values(obj) – returnerar en matris med värden.
- Object.entries(obj) – returnerar en matris med
par.
Observera skillnaderna (jämfört med till exempel map):
Map | Object | |
---|---|---|
Syntax för anrop | map.keys() |
Object.keys(obj) , men inte obj.keys() |
Returnerar | iterable | ”riktig” Array |
Den första skillnaden är att vi måste anropa Object.keys(obj)
, och inte obj.keys()
.
Varför? Den främsta anledningen är flexibilitet. Kom ihåg att objekt är en bas för alla komplexa strukturer i JavaScript. Så vi kan ha ett eget objekt som data
som implementerar sin egen data.values()
-metod. Och vi kan fortfarande kalla Object.values(data)
på det.
Den andra skillnaden är att Object.*
-metoder returnerar ”riktiga” arrayobjekt, inte bara en iterabel. Det är främst av historiska skäl.
Till exempel:
let user = { name: "John", age: 30};
Object.keys(user) =
Object.values(user) =
Object.entries(user) = , ]
Här är ett exempel på hur man kan använda Object.values
för att slinga sig över egenskapsvärden:
let user = { name: "John", age: 30};// loop over valuesfor (let value of Object.values(user)) { alert(value); // John, then 30}
Precis som en for..in
-slinga ignorerar dessa metoder egenskaper som använder Symbol(...)
som nycklar.
Oftast är det bekvämt. Men om vi vill ha symboliska nycklar också finns det en separat metod Object.getOwnPropertySymbols som returnerar en array med endast symboliska nycklar. Dessutom finns det en metod Reflect.ownKeys(obj) som returnerar alla nycklar.
Transformering av objekt
Objekt saknar många metoder som finns för matriser, t.ex. map
, filter
och andra.
Om vi vill tillämpa dem kan vi använda Object.entries
följt av Object.fromEntries
:
- Använd
Object.entries(obj)
för att få en matris med nyckel/värdepar frånobj
. - Använd arraymetoder på den arrayen, t.ex.
map
. - Använd
Object.fromEntries(array)
på den resulterande arrayen för att omvandla den tillbaka till ett objekt.
Till exempel har vi ett objekt med priser och vill fördubbla dem:
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
Det kan se svårt ut vid första anblicken, men blir lätt att förstå efter att du har använt det ett par gånger. Vi kan göra kraftfulla kedjor av transformationer på detta sätt.