Object.keys, values, entries

Să ne îndepărtăm de structurile de date individuale și să vorbim despre iterațiile peste ele.

În capitolul anterior am văzut metodele map.keys(), map.values(), map.entries().

Aceste metode sunt generice, există un acord comun de a le folosi pentru structurile de date. Dacă vom crea vreodată o structură de date proprie, ar trebui să le implementăm și pe acestea.

Ele sunt suportate pentru:

  • Map
  • Set
  • Array

Obiectele de tip Plain suportă, de asemenea, metode similare, dar sintaxa este un pic diferită.

Object.keys, values, entries

Pentru obiectele simple, sunt disponibile următoarele metode:

  • Object.keys(obj) – returnează un tablou de chei.
  • Object.values(obj) – returnează un tablou de valori.
  • Object.entries(obj) – returnează un tablou de perechi .

Rețineți distincțiile (în comparație cu map de exemplu):

Map Object
Sintaxa apelului map.keys() Object.keys(obj), dar nu obj.keys()
Returns iterable „real” Array

Prima diferență este că trebuie să apelăm Object.keys(obj), și nu obj.keys().

De ce așa? Motivul principal este flexibilitatea. Amintiți-vă că obiectele sunt o bază a tuturor structurilor complexe din JavaScript. Așadar, putem avea un obiect propriu, cum ar fi data, care își implementează propria metodă data.values(). Și tot putem apela Object.values(data) asupra lui.

A doua diferență este că metodele Object.* returnează obiecte array „reale”, nu doar un iterabil. Acest lucru este în principal din motive istorice.

De exemplu:

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

  • Object.keys(user) =
  • Object.values(user) =
  • Object.entries(user) = , ]

Iată un exemplu de utilizare a Object.values pentru a trece în buclă peste valorile proprietăților:

let user = { name: "John", age: 30};// loop over valuesfor (let value of Object.values(user)) { alert(value); // John, then 30}

Obiect.keys/values/entries ignoră proprietățile simbolice

La fel ca o buclă for..in, aceste metode ignoră proprietățile care folosesc Symbol(...) ca și chei.

De obicei, acest lucru este convenabil. Dar dacă vrem și chei simbolice, atunci există o metodă separată Object.getOwnPropertySymbols care returnează o matrice numai de chei simbolice. De asemenea, există o metodă Reflect.ownKeys(obj) care returnează toate cheile.

Transformarea obiectelor

Obiectelor le lipsesc multe metode care există pentru array-uri, de ex. , filter și altele.

Dacă dorim să le aplicăm, atunci putem folosi Object.entries urmată de Object.fromEntries:

  1. Utilizați Object.entries(obj) pentru a obține un array de perechi cheie/valoare din obj.
  2. Utilizați metodele array pe acel array, de exemplu map.
  3. Utilizați Object.fromEntries(array) pe array-ul rezultat pentru a-l transforma din nou într-un obiect.

De exemplu, avem un obiect cu prețuri și dorim să le dublăm:

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

Acesta poate părea dificil la prima vedere, dar devine ușor de înțeles după ce îl folosiți o dată sau de două ori. Putem face lanțuri puternice de transformări în acest fel.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.