Discover Functional Programming

Learning Objectives

Section 11.1: Context: A Movie List

Application Scenario

Building a movie application with filtering, sorting, and transformations:

This is ideal for functional programming.

Section 11.2: Program State

State Management

Functional programming emphasizes immutability:

// ❌ Modifying state directly
let movies = [
    { title: "Movie A", rating: 8 },
    { title: "Movie B", rating: 6 }
];

movies[0].rating = 9;  // Mutating data

// ✅ Creating new data
let updatedMovies = movies.map(movie => 
    movie.title === "Movie A" 
        ? { ...movie, rating: 9 }
        : movie
);

Avoiding State Mutations

// ❌ BAD: Modifies original array
let numbers = [1, 2, 3];
numbers.push(4);

// ✅ GOOD: Creates new array
let numbers = [1, 2, 3];
let newNumbers = [...numbers, 4];

Section 11.3: Pure Functions

What is a Pure Function?

A function that:

// ✅ Pure function
function add(a, b) {
    return a + b;
}

// ❌ Not pure: depends on external variable
let multiplier = 2;
function multiply(a) {
    return a * multiplier;
}

// ❌ Not pure: modifies external state
let result = 0;
function accumulateAdd(a) {
    result += a;
    return result;
}

Benefits of Pure Functions

// ✅ Pure: Easy to test and reason about
function calculateDiscount(price, rate) {
    return price * rate;
}

// ✅ Pure: No side effects
function getUserName(user) {
    return user.name;
}

// ❌ Not pure: Prints to console (side effect)
function displayUser(user) {
    console.log(user.name);  // Side effect!
}

Section 11.4: Array Operations

Functional Array Methods

let prices = [10, 20, 30];

let withTax = prices.map(price => price * 1.1);
console.log(withTax);  // [11, 22, 33]
let products = [
    { name: "Laptop", price: 1000 },
    { name: "Phone", price: 500 },
    { name: "Book", price: 15 }
];

let affordable = products.filter(p => p.price < 600);
console.log(affordable);  // Phone and Book
let numbers = [1, 2, 3, 4, 5];

let sum = numbers.reduce((acc, num) => acc + num, 0);
console.log(sum);  // 15

let product = numbers.reduce((acc, num) => acc * num, 1);
console.log(product);  // 120
let data = [1, 2, 3, 4, 5, 6];

let result = data
    .filter(n => n % 2 === 0)      // [2, 4, 6]
    .map(n => n * n)                // [4, 16, 36]
    .reduce((sum, n) => sum + n, 0); // 56

console.log(result);  // 56

Section 11.5: Higher Order Functions

Functions as Arguments

function processArray(array, callback) {
    let result = [];
    for (let item of array) {
        result.push(callback(item));
    }
    return result;
}

let numbers = [1, 2, 3, 4];

let doubled = processArray(numbers, n => n * 2);
console.log(doubled);  // [2, 4, 6, 8]

Returning Functions

function createMultiplier(factor) {
    return function(number) {
        return number * factor;
    };
}

let double = createMultiplier(2);
let triple = createMultiplier(3);

console.log(double(5));  // 10
console.log(triple(5));  // 15

Function Composition

function addTwo(n) {
    return n + 2;
}

function multiplyByThree(n) {
    return n * 3;
}

function compose(f, g) {
    return function(x) {
        return f(g(x));
    };
}

let process = compose(multiplyByThree, addTwo);
console.log(process(5));  // (5 + 2) * 3 = 21

Section 11.6: JavaScript: A Multi Paradigm Language

Using Both OOP and Functional

class MovieList {
    constructor(movies) {
        this.movies = movies;
    }

    getHighRated(minRating) {
        return this.movies
            .filter(m => m.rating >= minRating)
            .map(m => m.title);
    }
}

let list = new MovieList([
    { title: "Movie A", rating: 8 },
    { title: "Movie B", rating: 6 },
    { title: "Movie C", rating: 9 }
]);

console.log(list.getHighRated(7));  // ["Movie A", "Movie C"]

Coding Challenges

Challenge 11.1: Older Movies

Task: Filter movies released before a certain year

Challenge 11.2: Government Forms

Task: Transform and validate form data using pure functions

Challenge 11.3: Arrays Sum

Task: Calculate the sum of array elements using reduce()

Challenge 11.4: Students Results

Task: Process student grades with map and filter operations

Key Takeaways

✅ Pure functions have no side effects
✅ Avoid mutating data
✅ Use map(), filter(), reduce() for transformations
✅ Higher-order functions enhance flexibility
✅ Chain operations for clean, readable code
✅ JavaScript supports multiple paradigms

Quiz Questions


Next Module: Module 12 - Project 1: A Notetaking Program