Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

reduceRight

Boa noite galera, alguém me explica esse trecho do código? Eu entendi o objetivo do código que é executar as funções da direita para esquerda, guardando o resultado dela para a próxima função. Mas não entendi como isso se concretiza no código abaixo:

export const compose = (...fns) => value =>
    fns.reduceRight((previousValue, fn) =>
        fn(previousValue), value);

Achei meio confuso as variáveis e os parâmetros.

5 respostas

Antes deu lhe explicar, você pode me dizer se já domina o reduce? Conseguiria explica-lo para alguém rapidamente?

Não sei se conseguiria explicar "rapidamente", mas entendo a lógica do reduce, sim.

Entendo, principalmente, para fazer SOMATÓRIOS, assunto que já foi abordado em outros cursos de javascript aqui do alura, ministrado por você.

Ficou mais fácil de de eu entender, quando transformei de arrow function para função normal:

compose  = function (...fns){
        return function(value){
            return fns.reduceRight(function(previousValue,fn){
                return fn(previousValue);
            },value);
        }
}

Às vezes com arrow function fica tão reduzido o código que tenho dificuldades de interpretá-lo.

solução!

A função compose recebe um número indeterminado de funções. Ela retorna uma nova função que recebe um parametro apenas. É essa função que ao ser invocada com um único valor que disparará o reduceRight. O importante é saber nesse momento que uma função retornada lembra dos parâmetros da função que a retornou. Se não fosse assim ela não teria acesso a fns.

Quando você chamar a função retornada com um valor, esse valor será o previous value da última função do array fns. O pulo do gato está aqui:

fns.reduceRight((previousValue, fn) =>
        fn(previousValue), value)

O segundo parâmetro de reduceRight, o value será o previousValue na primeira chamada do reduceRight. Ou seja, o valor passado para a função que recebe um parâmetro apenas.

O resultado da última função será o previous value da função anterior até que todas as funções sejam chamadas. No final, teremos apenas um valor.

O reduceRight só será chamado quando a função retornada por compose for chamada.

As funções reduce e reduceRight não são feitas para apenas fazer somatórios, como seus nomes dizem, ela reduz um array a um único valor aplicando sua lógica de redução.

Consegui lançar uma luz sob a questão? Como você usou function para facilitar seu entendimento, experimente usar console.log para ver o que acontece quando chamar a função.

Qualquer coisa me fala.

Obrigado Flávio. Gostei da sua explicação. Na verdade ainda preciso compreender melhor as funções em javascript, pois eu ainda me confundo um pouco quando uma função retorna uma outra função (e a função interna lembrará do parâmetro que fora passado para ela). Mas criei uns exemplos fáceis que ajudaram a entender o problema.

let produto = function(a){
        return function(b){
            return a*b;
        }
}
let multiplicacaoPorDez = produto(10);
console.log(multiplicacaoPorDez(20));