• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Spread syntax, obiekt, tablica haszująca

Object Storage Arubacloud
0 głosów
180 wizyt
pytanie zadane 1 września 2018 w JavaScript przez Kamil Łydka Stary wyjadacz (13,600 p.)

Cześć, w jednym z moich projektów użyłem tablicy haszującej, a dokładniej obiektu który ma dwa klucze: byId  przechowujący tablicę oraz klucz byHash przechowujący obiekty. Aby zobrazować to bardziej na przykładzie, to podaję przykładowy zestaw danych takiego obiektu. 

state = {
  byId: [0, 1, 2],
  byHash: {
    0: {
      id: 0,
      content: { nameProduct: "chleb", categoryProduct: "pieczywo" }
    },
    1: {
      id: 1,
      content: { nameProduct: "czekolada", categoryProduct: "słodycze" }
    },
    2: {
      id: 2,
      content: { nameProduct: "piwo", categoryProduct: "alkohol" }
    }
  }
};

No i robiłem reducer, który zajmował mi się usuwaniem jednego z produktów (id usuwanego produktu dostaję w argumencie funkcji i nazywa się tutaj: action.id). O ile usunięcie jednej z wartości z kluczy byHash wydawało się w miarę proste (przeleciałem cały klucz metodą filter z warunkiem jednoID !== drugiegoID) tak usunięcie klucza byHash był malutkim wyzwaniem. Co prawda sobie poradziłem i odnalazłem rozwiązanie w internecie, ale postanowiłem do tego wrócić i zrozumieć to do końca. Rozwiązałem to w ten sposób: 

 const { [action.id]: deletedValue, ...newState } = state.byHash;
 console.log(newState); 

 konsoluje mi nową wartość klucza byHash, ofc bez tej usuniętej wartości. Czyli jak usunąłem czekoladę, to wykonsoluje mi: 

0:
content : {nameProduct: "chleb", categoryProduct: "pieczywo"}
id: 0
2: 
content: {nameProduct: "piwo", categoryProduct: "alkohol"}
id: 2

No i fajnie, że działa, ale jednak chciałbym się dowiedzieć dlaczego i co się dzieje tutaj :)  :

const { [action.id]: deletedValue, ...newState } = state.byHash;

Dodam tylko, że nie chcę sobie mutować stanu, więc nie chcę korzystać z delete.

1 odpowiedź

+1 głos
odpowiedź 1 września 2018 przez Comandeer Guru (601,110 p.)
wybrane 2 września 2018 przez Kamil Łydka
 
Najlepsza

Dodam tylko, że nie chcę sobie mutować stanu, więc nie chcę korzystać z delete.

A to przyniesie Ci jakąś wymierną korzyść przy tej aplikacji czy po prostu nie chcesz i już? Bo będąc JS devem starej szkoły nie jestem wyznawcą kościoła niemutowalności jakoś szczególnie :P

Natomiast co do kodu:

const { // 1
    [action.id]: deletedValue, // 2
    ...newState // 3
} = state.byHash;

Stosujemy tutaj destructuring (1). Do zmiennej deletedValue zapisujemy własność obiektu state.byHash, która znajduje się pod kluczem równym action.id (2). Nazwa tej własności jest w nawiasie kwadratowym, gdyż jest to tzw. computed property. Następnie przy pomocy operatora spread zapisujemy obiekt z pozostałymi kluczami do zmiennej newState (3).

komentarz 2 września 2018 przez Kamil Łydka Stary wyjadacz (13,600 p.)
Używam Reacta, który działa w ten sposób, że obserwuje zmiany stanu i na zmianę stanu się uaktywnia silnik renderujący. Przy zmianie stanu wewnętrznego może dojść dojść do desynchronizacji DOM I Virtual DOM. W moim przypadku dochodzi do tego jeszcze Redux, ale tak naprawdę działa on na tej samej zasadzie. Dlatego lepiej unikać mutowalności. Po co sobie generować problemy. :)

Dzięki wielkie za wytłumaczenie. :)

Podobne pytania

+1 głos
1 odpowiedź 429 wizyt
0 głosów
1 odpowiedź 102 wizyt
pytanie zadane 5 grudnia 2021 w JavaScript przez TOWaD Mądrala (5,700 p.)
+1 głos
3 odpowiedzi 354 wizyt
pytanie zadane 7 stycznia 2018 w JavaScript przez Janusz92 Bywalec (2,150 p.)

92,565 zapytań

141,416 odpowiedzi

319,599 komentarzy

61,950 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...