Śledzę programowanie funkcjonalne Jamesa Moore'a dla początkujących z kursem JavaScript. Jednak obecnie mam trudności ze zrozumieniem następującego kodu:

const reviews = [4.5, 4.0, 5.0, 2.0, 1.0, 5.0, 3.0, 4.0, 1.0, 5.0, 4.5, 3.0, 2.5, 2.0];

const countGroupedByReview = reviews.reduce(groupBy, {});

function groupBy (acc, review){
  const count = acc[review] || 0;
  return {...acc, [review]: count + 1}
}

Chociaż rozumiem sposób działania metody redukuj, staram się zrozumieć kod w bloku funkcyjnym groupBy. Uważam, że ma to coś wspólnego z obliczonymi nazwami właściwości. Byłbym bardzo wdzięczny za jakąkolwiek pomoc.

Dzięki.

2
Louis 7 kwiecień 2020, 16:49

2 odpowiedzi

Najlepsza odpowiedź

Nie wydaje się, aby w bloku kodu były jakieś obliczone nazwy właściwości. To, co robi ten blok kodu, polega na zliczaniu liczby wystąpień każdego wyniku recenzji w tablicy. Przejdźmy najpierw przez wywołanie zwrotne z jego argumentami:

Callback przyjmuje 2 argumenty:

  • acc to akumulator, czyli dane, do których reduktor będzie nadal wpychał. Najpierw jest zdefiniowany jako pusty obiekt, jako drugi argument w Array.prototype.reduce
  • review jest po prostu bieżącą pozycją w tablicy, przez którą aktualnie przechodzi iteracja

Teraz do kodu samego wywołania zwrotnego. Linia const count = acc[review] || 0 oznacza po prostu:

  1. Jeśli element tablicy istnieje jako klucz w akumulatorze, zwróć jego wartość
  2. Jeśli element tablicy nie istnieje jako klucz w akumulatorze, ustaw jego wartość na 0

Następnie po prostu zwiększ liczbę o 1, ponieważ właśnie napotkałeś element i chcesz dodać go do sumy całkowitej, pogrupowanej według wartości elementu tablicy. { ...acc, [review]: count + 1 } jest po prostu funkcją rozpraszania obiektów, co po prostu oznacza: zachowaj każdą parę klucz-wartość, jaką mam dla akumulatora, ale połącz zmiany dokonane dla określonej pary klucz-wartość.

4
Terry 8 kwiecień 2020, 12:49
{...acc, [review]: count + 1}

Tutaj rozłożył acc i dla bieżącego elementu dodaje 1 do poprzedniego zliczenia,

[1,3,3]

Na przykład, gdy zapętlisz tę tablicę w pierwszym elemencie, czyli 1 groupBy zwróci obiekt taki jak

{ 1: 1 }

Teraz w drugiej iteracji bieżącym elementem jest 3, więc groupBy rozłoży poprzedni obiekt, a ponieważ 3 nie pojawił się wcześniej, więc count = 0, zwrócona wartość groupBy będzie

{ 1: 1, 3: 1}

Teraz w trzeciej iteracji bieżącym elementem jest 3, więc groupBy rozłoży poprzednio zwrócony obiekt i dla klucza 3 dodaje 1, więc zwraca

{ 1: 1, 3: 2}


Prosta wersja może wyglądać mniej więcej tak

const reviews = [4.5, 4.0, 5.0, 2.0, 1.0, 5.0, 3.0, 4.0, 1.0, 5.0, 4.5, 3.0, 2.5, 2.0];

const countGroupedByReview = reviews.reduce(groupBy, {});

function groupBy(acc, review) {
  acc[review] = acc[review] || 0;
  acc[review]++
  return acc
}

console.log(countGroupedByReview)
3
Code Maniac 7 kwiecień 2020, 14:06