• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
203 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 (606,240 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ź 629 wizyt
0 głosów
1 odpowiedź 124 wizyt
pytanie zadane 5 grudnia 2021 w JavaScript przez TOWaD Mądrala (6,250 p.)
+1 głos
3 odpowiedzi 509 wizyt
pytanie zadane 7 stycznia 2018 w JavaScript przez Janusz92 Bywalec (2,150 p.)

93,191 zapytań

142,206 odpowiedzi

322,042 komentarzy

62,518 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 3053p. - dia-Chann
  2. 2998p. - Łukasz Piwowar
  3. 2993p. - Łukasz Eckert
  4. 2970p. - CC PL
  5. 2930p. - Tomasz Bielak
  6. 2907p. - Łukasz Siedlecki
  7. 2890p. - rucin93
  8. 2584p. - Adrian Wieprzkowicz
  9. 2536p. - Mikbac
  10. 2485p. - Marcin Putra
  11. 2461p. - Michał Telesz
  12. 2418p. - Michal Drewniak
  13. 2156p. - Anonim 3619784
  14. 1733p. - rafalszastok
  15. 1650p. - Mariusz Fornal
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...