flatMap y reduce para agrupar logs por día

Clase 16 de 24Curso de Manipulación Avanzada de Datos con JavaScript

Resumen

Transforma un registro de hábitos en información accionable: con JavaScript moderno, un arreglo de días de la semana y los métodos flatMap y reduce, obtienes un histograma que revela el día más productivo para completar hábitos. Verás cómo procesar todos los logs, evitar errores comunes y dejar listo el conteo para un bar chart.

¿Cómo identificar el día más productivo con flatMap y reduce?

Para graficar cuántos hábitos completas por día, se usa la lista completa de hábitos (no la filtrada). La idea es aplanar todos los logs y luego agrupar por día con un diccionario de frecuencias. Así obtienes la base del histograma.

  • Usar la lista total asegura una visión global del mes.
  • Las posiciones del arreglo de días importan para mapear índices a nombres.
  • flatMap crea una sola dimensión de logs.
  • reduce acumula el conteo por día.
  • El resultado es un objeto: día → cantidad.

Ejemplo conceptual en JavaScript:

// Días de la semana iniciando en lunes. const daysOfWeek = ['lunes','martes','miércoles','jueves','viernes','sábado','domingo']; // Aplanar todos los logs de todos los hábitos. const allLogs = habits.flatMap(habit => habit.logs); // Uso de flatMap. // Agrupar y contar por día usando reduce. const histogram = allLogs.reduce((acc, log) => { const dayName = daysOfWeek[log.dayIndex]; // La posición determina el día. acc[dayName] = (acc[dayName] || 0) + 1; return acc; }, {}); // Render provisional: inspeccionar el resultado en consola. function renderStats(counts) { console.log(counts); } renderStats(histogram);

¿Qué datos procesar y por qué importan los días de la semana?

La base es tu tracker de hábitos: ejemplos como leer, jugar a Xbox, caminar o hacer la cama. Cada hábito guarda logs por día (con rachas y estadísticas). Los días del mes se mapean a días de la semana para comparar productividad relativa.

  • Se trabaja con la lista completa, aunque exista un filtro opcional.
  • El arreglo de días inicia en lunes; la posición 0 representa “lunes”.
  • Las posiciones son clave para traducir índices a nombres.
  • Se busca cuántos logs caen en lunes, martes, jueves, etc.
  • El objetivo es un agrupamiento por día que alimente la gráfica.

Definición de los días (posiciones importantes):

const daysOfWeek = ['lunes','martes','miércoles','jueves','viernes','sábado','domingo'];

Observación de datos reales: hay hábitos con más actividad ciertos días (por ejemplo, “hasta el trece hice la cama”), lo que justifica el análisis por semana para detectar picos de cumplimiento.

¿Cómo validar, depurar y preparar la visualización con un histograma?

Tras implementar la lógica, se valida en el navegador: inspeccionar, hacer hard reload (la persistencia evita perder datos) y corregir errores de nombre de método antes de integrar el nuevo renderer a la UI.

¿Cómo depurar errores de naming en TypeScript?

  • Ver la consola e identificar el método ausente.
  • Revisar el service y confirmar el nombre correcto.
  • Cambiar de un método mal llamado a listHabits.
  • Con TypeScript, estos errores se previenen al tener tipado fuerte.

Ejemplo conceptual:

// Obtener la lista total desde el service. const habits = await service.listHabits(); // Nombre correcto del método.

¿Cómo verificar la persistencia y el render?

  • Abrir herramientas de desarrollador e inspeccionar la salida.
  • Hacer hard reload sin perder el estado gracias a la persistencia.
  • Probar el nuevo renderer junto a otros (por ejemplo, el de quote o tabla).
  • Confirmar que el histograma tenga conteos para domingo, jueves, etc.

¿Cómo llevar el conteo al bar chart?

  • Usar el objeto día → cantidad como dataset base.
  • Ordenar por daysOfWeek para columnas consistentes.
  • Preparar los valores para el bar chart en la siguiente etapa.

Ejemplo de dataset:

const labels = daysOfWeek; // Eje X: lunes a domingo. const data = daysOfWeek.map(d => histogram[d] || 0); // Conteos alineados.

Punto clave: el histograma ya está listo gracias a flatMap y reduce; el siguiente paso es graficarlo con un motor de gráficas en un bar chart y mostrarlo en la UI. ¿Qué día te sorprendió más en tu conteo? Comparte tu hallazgo y cuéntanos cómo piensas ajustar tus hábitos.