Реализация функций высокого порядка (конвейер, компоновка, сокращение, фильтрация) в нативном 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
))

Ссылка

Уведомление

  • Если вы хотите следить за последними новостями/статьями из серии заметок для чтения, пожалуйста, 「Смотрите」, чтобы подписаться.