Ejercicio: JavaScript y Node.js para bots
Objetivo
Practicar con map, filter, find y reduce sobre el catálogo del minimarket y escribir las funciones de dinero y de carrito que el bot usará en todas las lecciones siguientes.
Cómo se trabaja
La parte A es práctica real en tu terminal: dejas Node funcionando con un proyecto y una prueba. La parte B son cuatro funciones puras que se comprueban en esta página. Un producto del catálogo tiene la forma { id, nombre, precio, categoria } y una línea de carrito es { id, cantidad }.
💡 Reto extra
Escribe productosBaratos(catalogo, tope) que devuelva los nombres de los productos con precio menor o igual al tope, ordenados del más barato al más caro (usa filter, sort y map; recuerda copiar el array antes de ordenar con [...arr]).
Pasos
Marca cada paso a medida que lo completes. Tu avance se guarda en este navegador.
💡 Pista 1: Dos decimales
n.toFixed(2) devuelve un texto con dos decimales. Para el total, Math.round(suma * 100) / 100 evita colas como 0.30000000000000004.
💡 Pista 2: Buscar sin distinguir mayúsculas
Pasa ambos textos a minúsculas con toLowerCase() y usa includes. find devuelve undefined si no hay coincidencia: conviértelo con ?? null.
💡 Pista 3: reduce con valor inicial
carrito.reduce((suma, linea) => { ... return suma + algo; }, 0). Dentro, busca el producto con find; si no existe, devuelve suma sin cambios.
💡 Pista 4: Agrupar
Empieza con const grupos = {}. Por cada producto: if (!grupos[p.categoria]) grupos[p.categoria] = []; y luego grupos[p.categoria].push(p.nombre). También sirve reduce.
🔎 Comprueba tu trabajo
Pega tu código y pulsa Comprobar. La revisión ocurre en tu navegador; nada se envía a ningún sitio. Cada punto en rojo incluye una pista. Pega solo el JavaScript, sin las etiquetas <script>.
✅ Ver una solución posible
Intenta resolverlo antes de mirar. Tu versión puede ser distinta y también correcta.
function formatearSoles(n) {
return "S/ " + n.toFixed(2);
}
function buscarProducto(catalogo, texto) {
const buscado = String(texto).toLowerCase();
return catalogo.find((p) => p.nombre.toLowerCase().includes(buscado)) ?? null;
}
function totalCarrito(catalogo, carrito) {
const suma = carrito.reduce((acc, linea) => {
const p = catalogo.find((x) => x.id === linea.id);
if (!p) return acc;
return acc + p.precio * linea.cantidad;
}, 0);
return Math.round(suma * 100) / 100;
}
function agruparPorCategoria(productos) {
const grupos = {};
for (const p of productos) {
if (!grupos[p.categoria]) grupos[p.categoria] = [];
grupos[p.categoria].push(p.nombre);
}
return grupos;
}