javascript-bucle-foreach

Bucle forEach en JavaScript

El bucle forEach es una estructura de control en JavaScript que facilita iterar sobre elementos de una colección o secuencia de datos (como arrays, o conjuntos).

En JavaScript este bucle se realiza a través del método forEach(), que está disponible en las colecciones (en realidad, en los elementos iterables)

El bucle forEach ofrece varias ventajas sobre otros bucles tradicionales.

  • La sintaxis del bucle forEach es más clara y sencilla.
  • Al no depender de índices, reduce la posibilidad de cometer errores al acceder a elementos de la colección.

Sintaxis básica

La sintaxis básica de un bucle forEach en JavaScript es la siguiente:

colección.forEach((elemento) => {
    // Código a ejecutar para cada elemento de la colección
});
  • Colección: Es la colección de la que se van a iterar los elementos.
  • Elemento: Es el nombre de la variable que representa cada elemento en la iteración.
  • Instrucciones a ejecutar: Aquí se especifican las instrucciones que se ejecutan en cada iteración.

Vamos a verlo con un ejemplo simple donde se utilizamos un bucle forEach para iterar sobre un array de números:

let numeros = [1, 2, 3, 4, 5];

numeros.forEach(function(numero) {
    console.log(numero);
});

Este bucle forEach imprimirá cada número en la matriz numeros en una línea separada.

Utilizando arrow functions con forEach

También es posible utilizar Arrow Functions en lugar de funciones anónimas en la sintaxis de forEach (de hecho es muy habitual).

array.forEach((element) => {
  // Código a ejecutar para cada elemento
});

El ejemplo anterior utilizando arrow functions quedaría así:

const numeros = [1, 2, 3, 4, 5];

numeros.forEach((numero) => {
  console.log(numero);
});

Inmutabilidad de la colección

Una de las limitaciones del bucle forEach es que no permite modificar la colección que se está iterando directamente.

Si intentamos agregar o eliminar elementos de la colección dentro del propio bucle forEach, lo más normal es que se vuelva muy loco 😉.

Por ejemplo

let numeros = [1, 2, 3, 6, 7, 8];

numeros.forEach((num, index) => {
  if (num > 5) {
    numeros.splice(index, 1); // Intentamos eliminar elementos de la colección
  }
});

console.log(numeros); // [1, 2, 3, 7] esto no está bien

En este ejemplo,

  • Esperaríamos eliminar los valores >5, y por tanto obtener [1, 2, 3]
  • Sin embargo, obtenemos [1, 2, 3, 7]
  • Al modificar la colección con splice, las posiciones de los elementos han cambiado, lo que genera que forEach tenga comportamiento errático

Cuando se necesita modificar la colección durante la iteración:

  • Puedes usar otros bucles como for o while
  • Puedes crear una copia de la colección (y trabajas sobre ella)
let numeros = [1, 2, 3, 6, 7, 8];

// Hacemos una copia del array para iterar sobre ella
let copiaNumeros = [...numeros];

copiaNumeros.forEach((num, index) => {
  if (num > 5) {
    // Eliminar el número de la colección original
    numeros.splice(numeros.indexOf(num), 1);
  }
});

console.log(numeros); // [1, 2, 3] ahora está bien

Ejemplos prácticos