Źródło
Obie map
i reduce
mają jako dane wejściowe tablicę i funkcję, którą zdefiniujesz. Są w pewnym sensie komplementarne: map
nie mogą zwrócić pojedynczego elementu dla tablicy wielu elementów, a reduce
zawsze zwracają akumulator, który ostatecznie zmieniłeś.
map
Używając map
iteracji elementów, dla każdego elementu zwracasz żądany element.
Na przykład, jeśli masz tablicę liczb i chcesz uzyskać ich kwadraty, możesz to zrobić:
const square = x => x * x
console.log([1, 2, 3, 4, 5].map(square))
reduce
Używając tablicy jako danych wejściowych, możesz uzyskać pojedynczy element (powiedzmy obiekt, liczbę lub inną tablicę) na podstawie funkcji wywołania zwrotnego (pierwszy argument), która pobiera parametry accumulator
i current_element
:
const numbers = [1, 2, 3, 4, 5]
console.log(numbers.reduce(function (acc, current) {
return acc + current
}, 0))
console.log(numbers.reduce(function (acc, current) {
return acc * current
}, 1))
Którą wybrać, jeśli możesz zrobić to samo z obydwoma? Spróbuj sobie wyobrazić, jak wygląda kod. W podanym przykładzie możesz obliczyć tablicę squares, jak wspomniałeś, używając reduce
:
[1, 2, 3, 4, 5].reduce(function (acc, current) {
acc.push(current*current);
return acc;
}, [])
[1, 2, 3, 4, 5].map(x => x * x)
Patrząc na to, oczywiście druga implementacja wygląda lepiej i jest krótsza. Zwykle wybierasz czystsze rozwiązanie, którym w tym przypadku jest map
. Oczywiście możesz to zrobić reduce
, ale w skrócie zastanów się, który byłby krótszy i ostatecznie byłby lepszy.