Métodos Funcionales: map, filter y reduce
Aprende a transformar, filtrar y operar sobre listas de datos con programación funcional moderna usando map, filter, find, some, every y reduce.
Programación Funcional sobre Arrays en ES6+
En lugar de escribir bucles for imperativos con contadores y variables mutables, JavaScript moderno promueve el uso de métodos iterativos de orden superior. Estos métodos reciben funciones callback, no mutan el array original y hacen el código mucho más legible, declarativo y predecible.
| Método | Propósito Principal | Retorno |
|---|---|---|
.map(callback) |
Transforma cada elemento aplicando una regla o cálculo. | Un nuevo array con la misma cantidad de elementos. |
.filter(callback) |
Filtra los elementos según una condición lógica (predicado). | Un nuevo array con solo los elementos que retornaron true. |
.find(callback) |
Busca el primer elemento que cumpla la condición. | El elemento encontrado o undefined. |
.some(callback) |
Verifica si al menos un elemento cumple la condición. | Booleano (true o false). |
.every(callback) |
Verifica si todos los elementos cumplen la condición. | Booleano (true o false). |
.reduce(callback, inicio) |
Acumula todos los valores en un único resultado final (número, string, objeto). | El valor acumulado final. |
1. Transformación con .map()
Crea una nueva lista aplicando una función a cada elemento sin alterar la original:
const preciosNetos = [100, 250, 400];
const preciosConIva = preciosNetos.map(precio => precio * 1.19);
console.log(preciosConIva); // [119, 297.5, 476]
2. Filtrado con .filter()
Extrae únicamente los elementos que cumplan una regla:
const puntajes = [85, 42, 98, 60, 74];
const aprobados = puntajes.filter(nota => nota >= 60);
console.log(aprobados); // [85, 98, 60, 74]
3. Acumulación con .reduce()
Ideal para sumatorias, promedios o agrupación de datos:
const carrito = [
{ item: "Curso PHP", precio: 45 },
{ item: "Curso JS", precio: 35 },
{ item: "Libro CSS", precio: 20 }
];
const totalPagar = carrito.reduce((acumulador, producto) => acumulador + producto.precio, 0);
console.log("Total a pagar: $" + totalPagar); // 100
⚡ Filtrado y Transformación de Catálogo en Vivo
Aplica filter, map y reduce dinámicamente con botones sobre un catálogo de cursos:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Métodos Funcionales de Arrays</title>
<style>
body { font-family: Arial, Helvetica, sans-serif; padding: 25px; background: #f8fafc; }
.card-catalogo { max-width: 580px; background: white; border: 1px solid #cbd5e1; border-radius: 8px; padding: 22px; }
.filtros { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 16px; }
.filtros button { padding: 8px 14px; border: 1px solid #94a3b8; background: #f1f5f9; border-radius: 6px; cursor: pointer; font-weight: 600; }
.filtros button:hover { background: #0284c7; color: white; border-color: #0284c7; }
.resumen { background: #f0fdf4; border: 1px solid #86efac; color: #166534; padding: 12px; border-radius: 6px; margin-bottom: 15px; font-weight: 600; }
ul { list-style: none; padding: 0; margin: 0; }
li { display: flex; justify-content: space-between; padding: 10px 12px; border-bottom: 1px solid #e2e8f0; }
li:last-child { border-bottom: none; }
.tag { font-size: 0.75rem; padding: 2px 8px; border-radius: 12px; background: #e0f2fe; color: #0369a1; font-weight: bold; }
</style>
</head>
<body>
<div class="card-catalogo">
<h3 style="margin-top: 0; color: #0f172a;">Catálogo Académico Kilopolis</h3>
<div class="filtros">
<button onclick="mostrarTodos()">Todos</button>
<button onclick="filtrarNivel('Básico')">Solo Básico</button>
<button onclick="filtrarNivel('Avanzado')">Solo Avanzado</button>
<button onclick="aplicarDescuento(0.8)">Aplicar 20% Dto.</button>
</div>
<div class="resumen" id="caja-resumen">Cargando catálogo...</div>
<ul id="lista-cursos"></ul>
<script>
const cursosBase = [
{ id: 1, titulo: "HTML5 Semántico y Accesibilidad", precio: 30, nivel: "Básico" },
{ id: 2, titulo: "CSS3 Flexbox y CSS Grid", precio: 40, nivel: "Básico" },
{ id: 3, titulo: "JavaScript ES6+ Asíncrono", precio: 50, nivel: "Avanzado" },
{ id: 4, titulo: "PHP 8.3 & Arquitectura MVC", precio: 60, nivel: "Avanzado" }
];
let cursosVisibles = [...cursosBase];
function renderizar() {
const lista = document.getElementById('lista-cursos');
const resumen = document.getElementById('caja-resumen');
// reduce para calcular la sumatoria
const total = cursosVisibles.reduce((acc, c) => acc + c.precio, 0);
resumen.textContent = `Cursos listados: ${cursosVisibles.length} · Valor total del grupo: $${total} USD`;
lista.innerHTML = cursosVisibles.map(c => `
<li>
<span><strong>${c.titulo}</strong> <span class="tag">${c.nivel}</span></span>
<span style="font-weight: 600; color: #0f172a;">$${c.precio} USD</span>
</li>
`).join('');
}
function mostrarTodos() {
cursosVisibles = [...cursosBase];
renderizar();
}
function filtrarNivel(nivel) {
// filter para seleccionar por condición
cursosVisibles = cursosBase.filter(c => c.nivel === nivel);
renderizar();
}
function aplicarDescuento(factor) {
// map para recalcular precios inmutablemente
cursosVisibles = cursosVisibles.map(c => ({
...c,
precio: Math.round(c.precio * factor)
}));
renderizar();
}
renderizar();
</script>
</div>
</body>
</html>
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.🚀 ¿Quieres dominar Manual Completo de JavaScript ES6+ y crear proyectos reales?
Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.
🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.