JSON y forEach en JavaScript: Guardar y Recorrer Datos Como un Pro

Aprende a convertir objetos, guardar datos en localStorage y recorrer arrays con forEach. Todo integrado en un proyecto práctico real.

¿Has intentado guardar datos en tu página web y se pierden al recargar? ¿Te confunde cómo trabajar con información que viene de APIs o bases de datos? Te entiendo perfectamente.

En este tutorial vas a aprender dos herramientas esenciales que todo desarrollador JavaScript necesita: JSON para convertir y guardar datos, y forEach para recorrer listas de forma simple.

🎯 ¿Qué vamos a aprender?

  • Qué es JSON y por qué es tan importante
  • JSON.parse() para convertir texto en objetos
  • JSON.stringify() para convertir objetos en texto
  • forEach() para recorrer arrays sin complicaciones
  • localStorage para guardar datos sin base de datos
  • Proyecto completo: Lista de tareas que persiste

📦 ¿Qué es JSON?

JSON (JavaScript Object Notation) es el formato universal para intercambiar datos. Imagínalo como el "idioma común" que usan todas las aplicaciones web para comunicarse.

Veamos la diferencia:

// ✅ Objeto JavaScript (solo en tu código)
const persona = {
  nombre: "Ana",
  edad: 25
};

// ✅ JSON (texto que se puede enviar/guardar/recibir)
'{"nombre":"Ana","edad":25}'

⚠️ Importante:

JSON siempre es texto (string). Los objetos JavaScript son código. JSON es el puente entre ambos.

🔄 JSON.stringify(): De Objeto a Texto

Cuando quieres guardar un objeto o enviarlo a un servidor, usas JSON.stringify():

const misDatos = {
  usuario: "carlos",
  puntuacion: 150,
  nivel: 3
};

// Convertir a JSON (texto)
const datosEnTexto = JSON.stringify(misDatos);

console.log(datosEnTexto);
// Resultado: '{"usuario":"carlos","puntuacion":150,"nivel":3}'

💡 ¿Cuándo usar JSON.stringify()?

  • Guardar datos en localStorage
  • Enviar datos a un servidor
  • Convertir arrays/objetos para almacenar

📥 JSON.parse(): De Texto a Objeto

Cuando recibes datos guardados o de una API, usas JSON.parse() para convertirlos de nuevo en objetos:

// Texto JSON (como viene del servidor o localStorage)
const textoJSON = '{"nombre":"Laura","tareas":["estudiar","ejercicio"]}';

// Convertir a objeto JavaScript
const datosReales = JSON.parse(textoJSON);

console.log(datosReales.nombre); // "Laura"
console.log(datosReales.tareas); // ["estudiar", "ejercicio"]

❌ Error común:

// ❌ MAL: Intentar usar datos JSON como objeto
const textoJSON = '{"nombre":"Pedro"}';
console.log(textoJSON.nombre); // undefined (es texto, no objeto)

// ✅ BIEN: Primero convertir con JSON.parse()
const objeto = JSON.parse(textoJSON);
console.log(objeto.nombre); // "Pedro"

🔄 Array.forEach(): Recorrer Listas Fácil

forEach() es la forma más simple de recorrer un array. Ejecuta una función para cada elemento:

const frutas = ["manzana", "plátano", "naranja"];

// Mostrar cada fruta
frutas.forEach(fruta => {
  console.log("Fruta: " + fruta);
});

// Resultado:
// Fruta: manzana
// Fruta: plátano
// Fruta: naranja

📊 forEach vs bucle for tradicional

// ❌ Forma antigua (más complicada)
for (let i = 0; i < frutas.length; i++) {
  console.log(frutas[i]);
}

// ✅ Forma moderna (más simple)
frutas.forEach(fruta => {
  console.log(fruta);
});

💾 localStorage: Tu Almacén Personal

localStorage es como un cajón en el navegador donde puedes guardar información. Los datos persisten aunque cierres la página.

// Guardar datos
localStorage.setItem("usuario", "María");

// Recuperar datos
const usuario = localStorage.getItem("usuario");
console.log(usuario); // "María"

// Eliminar datos
localStorage.removeItem("usuario");

⚠️ Limitación importante:

localStorage solo guarda texto. Por eso necesitas JSON.stringify() para guardar objetos y JSON.parse() para recuperarlos.

🛠️ Combinando Todo: Proyecto Lista de Tareas

Vamos a crear una lista de tareas que se guarda automáticamente y no se pierde al recargar la página.

HTML básico:

<div id="app">
  <h2>Mi Lista de Tareas</h2>
  
  <input type="text" id="nuevaTarea" placeholder="Escribe una tarea...">
  <button id="agregarBtn">Agregar</button>
  
  <ul id="listaTareas"></ul>
  
  <button id="limpiarBtn">Limpiar Todo</button>
</div>

JavaScript completo:

// 📋 Array para guardar todas las tareas
let tareas = [];

// 🔗 Referencias a elementos HTML
const inputTarea = document.getElementById('nuevaTarea');
const botonAgregar = document.getElementById('agregarBtn');
const listaTareas = document.getElementById('listaTareas');
const botonLimpiar = document.getElementById('limpiarBtn');

// 💾 Función para guardar tareas en localStorage
function guardarTareas() {
  // Convertir array a texto JSON y guardarlo
  const tareasTexto = JSON.stringify(tareas);
  localStorage.setItem('misTareas', tareasTexto);
  console.log('Tareas guardadas!');
}

// 📥 Función para cargar tareas desde localStorage
function cargarTareas() {
  // Obtener texto JSON desde localStorage
  const tareasGuardadas = localStorage.getItem('misTareas');
  
  // Si existe, convertir de JSON a array
  if (tareasGuardadas) {
    tareas = JSON.parse(tareasGuardadas);
    console.log('Tareas cargadas:', tareas);
  }
}

// 📺 Función para mostrar tareas en pantalla
function mostrarTareas() {
  // Limpiar lista actual
  listaTareas.replaceChildren();
  
  // 🔄 Usar forEach para recorrer todas las tareas
  tareas.forEach((tarea, index) => {
    // Crear elemento de lista para cada tarea
    const li = document.createElement('li');
    li.textContent = tarea;
    
    // Botón para eliminar tarea individual
    const botonEliminar = document.createElement('button');
    botonEliminar.textContent = '❌';
    botonEliminar.addEventListener('click', () => {
      eliminarTarea(index);
    });
    
    li.appendChild(botonEliminar);
    listaTareas.appendChild(li);
  });
}

// ➕ Función para agregar nueva tarea
function agregarTarea() {
  const nuevaTarea = inputTarea.value.trim();
  
  if (nuevaTarea !== '') {
    tareas.push(nuevaTarea);
    inputTarea.value = '';
    guardarTareas();
    mostrarTareas();
  }
}

// ❌ Función para eliminar tarea específica
function eliminarTarea(index) {
  tareas.splice(index, 1);
  guardarTareas();
  mostrarTareas();
}

// 🗑️ Función para limpiar todas las tareas
function limpiarTodo() {
  tareas = [];
  localStorage.removeItem('misTareas');
  mostrarTareas();
}

// 🎯 Event Listeners
botonAgregar.addEventListener('click', agregarTarea);
botonLimpiar.addEventListener('click', limpiarTodo);

// Enter para agregar tarea
inputTarea.addEventListener('keypress', (e) => {
  if (e.key === 'Enter') {
    agregarTarea();
  }
});

// 🚀 Inicializar aplicación al cargar la página
document.addEventListener('DOMContentLoaded', () => {
  cargarTareas();
  mostrarTareas();
});

🎉 ¿Qué hace este código?

  • cargarTareas(): Usa JSON.parse() para recuperar tareas guardadas
  • mostrarTareas(): Usa forEach() para mostrar cada tarea
  • guardarTareas(): Usa JSON.stringify() para guardar el array
  • Persistencia: Las tareas no se pierden al recargar

🔍 Desglose del Flujo Completo

1️⃣ Usuario escribe tarea
2️⃣ Se agrega al array tareas
3️⃣ JSON.stringify() convierte a texto
4️⃣ localStorage guarda el texto

Al recargar la página:

1️⃣ localStorage devuelve texto JSON
2️⃣ JSON.parse() convierte a array
3️⃣ forEach() recorre cada tarea
4️⃣ Se muestran en pantalla

💡 Consejos para Expandir el Proyecto

// 📅 Agregar fecha a cada tarea
const tarea = {
  texto: inputTarea.value,
  fecha: new Date().toLocaleDateString(),
  completada: false
};

// ✅ Marcar como completada
tareas.forEach((tarea, index) => {
  if (tarea.completada) {
    li.style.textDecoration = 'line-through';
  }
});

// 🔍 Filtrar tareas pendientes
const tareasPendientes = tareas.filter(tarea => !tarea.completada);

❌ Errores comunes con JSON:

  • Olvidar JSON.parse(): Intentar usar datos JSON como objetos
  • Datos undefined: No verificar si existe en localStorage antes de hacer parse
  • Sintaxis JSON inválida: JSON malformado rompe JSON.parse()

📚 Recapitulación

🎯 Lo que has aprendido:

  • JSON.stringify(): Convierte objetos/arrays a texto para guardar
  • JSON.parse(): Convierte texto JSON de vuelta a objetos
  • forEach(): Recorre arrays de forma simple y limpia
  • localStorage: Guarda datos que persisten entre sesiones
  • Integración: Cómo combinar todo en un proyecto real

🚀 ¿Qué sigue después?

Con estos métodos ya puedes crear aplicaciones que:

💪 ¿Listo para el siguiente nivel?

Domina más métodos JavaScript esenciales y crea aplicaciones aún más avanzadas.

👉 JavaScript Básico: Variables y Buenas Prácticas

Refuerza tus fundamentos con variables, bucles y las mejores prácticas de JavaScript.