Реализация функций высокого порядка (конвейер, компоновка, сокращение, фильтрация) в нативном JS
сочинять
f . g = f(g(x))
const compose = (...fns) => { if (fns.length === 1) { return fns[0]; } const lastFn = fns[fns.length - 1]; const restFns = fns.slice(1); return (...args) => { return restFns.reduceRight((result, fn) => { return fn(result) }, lastFn(...args)) } }
const double = x => x * 2; const plus5 = x => x + 5;
const doubleAndPlus5 = compose(plus5, double); console.log(doubleAndPlus5(2)); // 2 * 2 + 5 => 9
трубка
f . g = g(f(x))
const pipe = (fn, ...restFns) => { if (restFns.length === 0) { return fn; } return (...args) => { return restFns.reduce((result, nextFn) => { return nextFn(result) }, fn(...args)) } }
const double = x => x * 2; const plus5 = x => x + 5;
const plus5AndDouble = pipe(plus5, double); console.log(plus5AndDouble(2)); // (2 + 5) * 2 = 14
фильтр массива
const filter = (arr, predicate) => { if(arr.length === 0) { return arr; } const [element, ...restArr] = arr; return predicate(element) ? [ element, ...(filter(restArr, predicate)) ] : filter(restArr, predicate) }
const lessThan5 = x => x < 5;
const arr = [1,10, 6, 4];
console.log(filter(arr, lessThan5)); // [1,4]
массив уменьшить
const reduce = (arr, reducer, accumulator) => { if(arr.length === 0) { return accumulator; }
const [ element, ...restArr ] = arr; return reduce( restArr, reducer, reducer(accumulator, element) ) }
const sum = (a, b) => a + b;
console.log(reduce( [1,2,3,4], sum, 0 ))
Ссылка
Уведомление
- Если вы хотите следить за последними новостями/статьями из серии заметок для чтения, пожалуйста, 「Смотрите」, чтобы подписаться.