Saltar al contenido
Chatbots de WhatsApp desde cero
Temario

Ejercicio: JavaScript y Node.js para bots

  • ⏱ 45 minutos
  • 📶 Nivel: básico

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]).

▶ Prueba tu código aquí (opcional)
Consola

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.

    funciones.js
    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;
    }