Functional Programming using JavaScript

By Prajwal Haniya

-> Different programming paradigms: Imperative, Declarative, Object-Oriented and Functional.

What is functional Programming?

Pure Functions

//Pure function

//Example 1
function writeJsonString(object) {
    return JSON.stringify(object, null, 2);
}

//Example 2
function exclusiveOr(A, B) {
    return (A || B) && !(A && B);
}

Why functional programming?

When a function is considered as not pure?

// Not pure

function setColor(R, G, B) {
    const hex = rgbToHex(R, G, B);
    const colorMe = document.getElementById('color-me');
    colorMe.setAttribute('style', 'color: ' + hex);
}
Staying out of the loop with recursion

Recursion:

// An iterartive approach

function sum(numbers) {
    let total = 0;
    for (let i = 0; i < numbers.length; i++) {
        total += numbers[i];
    }
    return total;
}

let numbers = [1, 2, 3, 4, 5];
let res = sum(numbers);
console.log(res);

The same can be done using recursive approach

function sum(numbers) {
    let n = numbers.length;
    //base case
    if (n === 1) return numbers[0];
    else {
        return numbers[0] + sum(numbers.slice(1));
    }
}

let numbers = [1, 2, 3, 4, 5];
let res = sum(numbers);
console.log(res);

Higher order functions

Implementing map,filter and reduce as functions

Map:

const map = (arr, mapFunc) => {
    const mapArr = [];
    for (let i = 0; i < arr.length; i++) {
        const result = mapFunc(arr[i], i, arr);
        mapArr.push(result);
    }
    return mapArr;
};

let arr = [1, 2, 3, 4, 5];
const sqrArr = map(arr, (n) => n ** 2);
console.log(sqrArr);

Filter:

const filter = (arr, filterFunc) => {
    const filterArr = [];
    for (let i = 0; i < arr.length; i++) {
        const result = filterFunc(arr[i], i, arr);
        if (result) {
            filterArr.push(arr[i]);
        }
    }
    return filterArr;
};

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const evenArr = filter(arr, (n) => n % 2 === 0);
console.log(evenArr);

Reduce:

function reduce(arr, reducer, initialValue) {
    let accumulator = initialValue === undefined ? 0 : initialValue;
    for (let i = 0; i < arr.length; i++)
        accumulator = reducer(accumulator, arr[i], i, arr);

    return accumulator;
}
const sumReducer = (accumulator, currentValue) => accumulator + currentValue;

let arr = [1, 2, 3, 4, 5];

const sum = reduce(arr, sumReducer);
console.log(sum);