JavaScript array methods like map(),
filter(), and reduce() are essential tools
for every developer. They help you write cleaner, more readable code
while making data manipulation a breeze. In this guide, we'll
demystify these methods with simple, real-world examples.
Why Learn These Array Methods?
Before these methods, developers used for loops for
everything. While loops still have their place, modern array methods
offer:
- Cleaner code - Less boilerplate, more readability
- Fewer bugs - No manual index management
- Functional programming - Write more predictable code
- Chainability - Combine methods for powerful operations
Let's explore each method with practical examples!
Array.map() - Transform Every Item
What it does: Creates a new array by applying a function to every element in the original array.
Use it when: You need to transform or modify each item in an array.
Basic Example
// Double every number
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(num => num * 2);
console.log(doubled); // [2, 4, 6, 8, 10]
console.log(numbers); // [1, 2, 3, 4, 5] (original unchanged!)
Key point: map() always returns a new
array with the same length as the original.
Real-World Example: User List
const users = [
{ id: 1, firstName: 'John', lastName: 'Doe' },
{ id: 2, firstName: 'Jane', lastName: 'Smith' },
{ id: 3, firstName: 'Bob', lastName: 'Johnson' }
];
// Create full names
const fullNames = users.map(user => `${user.firstName} ${user.lastName}`);
console.log(fullNames);
// ['John Doe', 'Jane Smith', 'Bob Johnson']
// Or extract just IDs
const userIds = users.map(user => user.id);
console.log(userIds); // [1, 2, 3]
Map with Index
const fruits = ['apple', 'banana', 'orange'];
const numbered = fruits.map((fruit, index) => {
return `${index + 1}. ${fruit}`;
});
console.log(numbered);
// ['1. apple', '2. banana', '3. orange']
Array.filter() - Keep Only What You Need
What it does: Creates a new array containing only
elements that pass a test (return true).
Use it when: You want to select specific items from an array based on a condition.
Basic Example
// Keep only even numbers
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const evenNumbers = numbers.filter(num => num % 2 === 0);
console.log(evenNumbers); // [2, 4, 6, 8, 10]
Real-World Example: Product Filter
const products = [
{ name: 'Laptop', price: 999, inStock: true },
{ name: 'Phone', price: 699, inStock: false },
{ name: 'Tablet', price: 399, inStock: true },
{ name: 'Monitor', price: 299, inStock: true },
{ name: 'Keyboard', price: 79, inStock: false }
];
// Show only products in stock
const availableProducts = products.filter(product => product.inStock);
console.log(availableProducts);
// [
// { name: 'Laptop', price: 999, inStock: true },
// { name: 'Tablet', price: 399, inStock: true },
// { name: 'Monitor', price: 299, inStock: true }
// ]
// Affordable products under $500
const affordable = products.filter(product => product.price < 500);
console.log(affordable);
// [
// { name: 'Tablet', price: 399, inStock: true },
// { name: 'Monitor', price: 299, inStock: true },
// { name: 'Keyboard', price: 79, inStock: false }
// ]
Filter with Multiple Conditions
// Products that are in stock AND affordable
const affordableInStock = products.filter(product => {
return product.inStock && product.price < 500;
});
console.log(affordableInStock);
// [
// { name: 'Tablet', price: 399, inStock: true },
// { name: 'Monitor', price: 299, inStock: true }
// ]
Array.reduce() - Combine Into One Value
What it does: Reduces an array to a single value by applying a function that accumulates results.
Use it when: You need to calculate a total, combine values, or transform an array into a single result.
Basic Example: Sum Numbers
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((total, num) => {
return total + num;
}, 0); // 0 is the starting value
console.log(sum); // 15
// How it works step-by-step:
// Step 1: total = 0, num = 1 → return 0 + 1 = 1
// Step 2: total = 1, num = 2 → return 1 + 2 = 3
// Step 3: total = 3, num = 3 → return 3 + 3 = 6
// Step 4: total = 6, num = 4 → return 6 + 4 = 10
// Step 5: total = 10, num = 5 → return 10 + 5 = 15
Real-World Example: Shopping Cart Total
const cart = [
{ item: 'Laptop', price: 999, quantity: 1 },
{ item: 'Mouse', price: 29, quantity: 2 },
{ item: 'Keyboard', price: 79, quantity: 1 }
];
const total = cart.reduce((sum, item) => {
return sum + (item.price * item.quantity);
}, 0);
console.log(total); // 1136
// 999 + (29 * 2) + 79 = 999 + 58 + 79 = 1136
Advanced Example: Count Occurrences
const fruits = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'];
const fruitCount = fruits.reduce((count, fruit) => {
count[fruit] = (count[fruit] || 0) + 1;
return count;
}, {});
console.log(fruitCount);
// { apple: 3, banana: 2, orange: 1 }
Transform Array to Object
const users = [
{ id: 1, name: 'John' },
{ id: 2, name: 'Jane' },
{ id: 3, name: 'Bob' }
];
const usersById = users.reduce((obj, user) => {
obj[user.id] = user.name;
return obj;
}, {});
console.log(usersById);
// { 1: 'John', 2: 'Jane', 3: 'Bob' }
Combining Methods (The Power Combo!) 🚀
The real magic happens when you chain these methods together:
Example: E-commerce Dashboard
const orders = [
{ id: 1, status: 'completed', total: 150 },
{ id: 2, status: 'pending', total: 89 },
{ id: 3, status: 'completed', total: 200 },
{ id: 4, status: 'cancelled', total: 50 },
{ id: 5, status: 'completed', total: 175 }
];
// Calculate total revenue from completed orders
const completedRevenue = orders
.filter(order => order.status === 'completed') // Keep only completed
.map(order => order.total) // Extract totals
.reduce((sum, total) => sum + total, 0); // Sum them up
console.log(completedRevenue); // 525
Example: User Analytics
const users = [
{ name: 'John', age: 25, active: true },
{ name: 'Jane', age: 30, active: true },
{ name: 'Bob', age: 35, active: false },
{ name: 'Alice', age: 28, active: true }
];
// Get average age of active users
const activeUsers = users.filter(user => user.active);
const totalAge = activeUsers.reduce((sum, user) => sum + user.age, 0);
const averageAge = totalAge / activeUsers.length;
console.log(averageAge); // 27.67
// Or chain it all together:
const avgAge = users
.filter(user => user.active)
.reduce((sum, user, index, array) => {
sum += user.age;
return index === array.length - 1 ? sum / array.length : sum;
}, 0);
console.log(avgAge); // 27.67
Common Patterns and Tips
1. Default Values in Reduce
// Always provide an initial value to avoid errors with empty arrays
const emptyArray = [];
// ❌ Can cause errors
const badSum = emptyArray.reduce((a, b) => a + b);
// ✅ Safe with initial value
const goodSum = emptyArray.reduce((a, b) => a + b, 0);
console.log(goodSum); // 0
2. Arrow Function Shortcuts
const numbers = [1, 2, 3, 4, 5];
// Long form
const doubled = numbers.map(num => {
return num * 2;
});
// Short form (implicit return)
const doubled2 = numbers.map(num => num * 2);
// Both produce the same result: [2, 4, 6, 8, 10]
3. When NOT to Use These Methods
-
Breaking early: If you need to stop the loop
early, use a
forloop instead -
Async operations: These methods don't work well
with
async/await(usefor...ofinstead) -
Mutating arrays: If you need to modify the
original array, consider
forEach()or a traditional loop
Quick Reference Cheat Sheet
// MAP - Transform each item
const newArray = array.map(item => transformation);
// FILTER - Keep items that pass a test
const filtered = array.filter(item => condition);
// REDUCE - Combine into single value
const result = array.reduce((accumulator, item) => {
return newAccumulator;
}, initialValue);
// CHAINING - Combine methods
const result = array
.filter(item => condition)
.map(item => transformation)
.reduce((acc, item) => acc + item, 0);
Practice Exercises
Try these challenges to test your understanding:
- Given an array of numbers, return the sum of all even numbers
- Convert an array of Celsius temperatures to Fahrenheit
- Find the most expensive product from an array of products
- Group users by age range (18-25, 26-35, 36+)
Key Takeaways
- map() transforms every element → new array (same length)
- filter() selects elements → new array (same or shorter)
- reduce() combines elements → single value
- All three methods create new arrays/values (don't mutate originals)
- Chain methods together for powerful data transformations
- Always consider readability - sometimes a simple loop is better
These three methods will become your go-to tools for array manipulation. Practice with real-world data, and soon you'll be writing cleaner, more expressive JavaScript code!
Pro tip: Open your browser console and practice these methods with your own data. Hands-on experience is the best way to learn!