Помогите расшифровать код javascript. Compose, reduce

Этот код фильтрует юзеров по возрасту, и возвращает массив имен, кто старше 18. Но что конкретно делает строчка "functions.reduceRight((arg, fn) => fn(arg), args)"?

const compose = (...functions) => 
    args => functions.reduceRight((arg, fn) => fn(arg), args);

compose(map(u => u.name), filter(u => u.age >= 18))

Ответы (1 шт):

Автор решения: Aziz Umarov

Давайте разберемся

const compose = (...functions) => 
    args => functions.reduceRight((arg, fn) => fn(arg), args);

compose(map(u => u.name), filter(u => u.age >= 18));
  1. const compose = (...functions) ...- объявление стрелочной функции с параметрами собранными в массив functions

  2. compose(map(u => u.name), filter(u => u.age >= 18)) - Вызов compose с параметрами: functions[0] = map(u => u.name) и functions[1] = filter(u => u.age >= 18);

  3. args => functions.reduceRight((arg, fn) => fn(arg), args); - можно переписать так (args) => { return functions.reduceRight((arg, fn) =>{ return fn(arg);}, args);}

  4. Вот мы и добрались до functions.reduceRight((arg, fn) =>{ return fn(arg);}, args); - эта строка вызывает reduceRight для массива functions в котором сидят наши функции с начальным значением args для аккумулятора arg и изменением его значения на каждой итерации на fn(arg) или если расписать то.

      arg = args; // начальное значение аккумулятора
      arg = functions[functions.lenght - 1](arg); // изменение значения аккумулятора на первой итерации
      arg = functions[functions.lenght - 2](arg);// второй итерации
      .....
      arg = functions[0](arg);// на последней итерации
      return arg;
    
    

Надеюсь что стало чуть яснее.

→ Ссылка