Object.keys, values, entries

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}

Object.keys/values/entries ignorerar symboliska egenskaper

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:

  1. Använd Object.entries(obj) för att få en matris med nyckel/värdepar från obj.
  2. Använd arraymetoder på den arrayen, t.ex. map.
  3. 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.

Lämna ett svar

Din e-postadress kommer inte publiceras.