¿Cómo recorrer un array en JavaScript? Con ejemplos!
Recorrer un array en JavaScript es esencial para manejar y transformar datos de forma eficiente. ¿Sabías que puedes trabajar con arrays asociativos, bidimensionales e incluso arrays de objetos? En este artículo, te mostraremos cómo hacerlo paso a paso, con ejemplos claros y prácticos que te ayudarán a dominar esta habilidad clave en tus proyectos de programación. ¡Sigue leyendo y aprende a recorrer cualquier tipo de array como un profesional!

Un ARRAY en JavaScript es una estructura de datos que permite almacenar múltiples valores en una sola variable. Estos valores se almacenan en un orden específico y son accesibles mediante índices numéricos que comienzan en 0.
Índice
1. ¿Qué significa recorrer un array en JavaScript?
Recorrer un array en JavaScript significa examinar o procesar cada elemento del array uno por uno. Este proceso permite realizar acciones como:
- Leer datos: Obtener el valor de cada elemento.
- Transformar datos: Modificar o crear nuevos valores a partir de los existentes.
- Buscar elementos: Encontrar elementos específicos que cumplen ciertas condiciones.
- Filtrar elementos: Crear subconjuntos del array basado en reglas.
- Realizar cálculos: Sumar valores, concatenar cadenas, etc.
1.1. Ejemplo sencillo recorriendo un array.
Supongamos que tienes un array con una lista de números:
let numeros = [10, 20, 30, 40];Lenguaje del código: JavaScript (javascript)
Y ahora queremos recorrer cada uno de sus elementos ([10, 20, 30, 40])y multiplicarlos por 2, e imprimir el resultado en la consola.
Para ellos podemos usar un bulce for (mas adelante ampliamos su uso):
// Recorremos el array usando un bucle for
for (let i = 0; i < numeros.length; i++) {
// Multiplicamos el elemento actual por 2 y lo guardamos en una nueva variable
let resultado = numeros[i] * 2;
// Imprimimos el resultado en la consola
console.log(resultado);
}Lenguaje del código: JavaScript (javascript)
Aquí, usando el bucle for recorremos cada uno de los elementos para realizar una acción sobre cada uno de ellos (multiplicarlos por 2 en este caso), y luego usando console.log imprimimos dicho resultado en la consola.
El resultado sería:
20
40
60
80
NOTA!!!! Si te animas y deseas ver el resultado de este ejemplo y de todos los que iremos proporcionando directamente desde tu PC, te invito a seguir estos pasos.
- Primero, revisa el punto 5 del siguiente artículo sobre como usar e instalar VSCode (este es el editor de código mas usado), donde encontrarás los pasos para crear la estructura necesaria para visualizar una página desde tu navegador predeterminado.
- Si entendiste correctamente este paso anterior, sabrás donde colocar el código
scriptque te acabamos de proporcionar (arriba). Ahora, puedes visualizar el resultado, para ello puedes hacer lo siguiente:- Una vez abierta y visualizada la página, abre la consola del navegador presionando la tecla F12.
- Ahora, dirígete a la pestaña que dice
Console, y desde aquí podrás ver el resultado del script que hayamos introducido anteriormente.
- No te preocupes, estos pasos son más simples de lo que parecen!!!! Entonces… cada vez que dejemos un código de ejemplo como éste, puedes seguir estos pasos y ver los resultados por ti mismo. ¡Ojalá te animes!!!!
1.2. ¿Para qué sirve recorrer un array en JavaScript?
Como dijimos, recorrer un array en JavaScript nos permite acceder a cada uno de los elementos que lo componen de forma individual, y realizar alguna operación sobre ellos.
¿Pero para que hacer esto?
Las posibilidades son infinitas, pero aquí te presento algunos ejemplos comunes:
- Mostrar datos en pantalla:
- Si tienes un array con los nombres de tus amigos, puedes recorrerlo para mostrar cada nombre en una lista HTML.
- Realizar cálculos:
- Puedes sumar todos los números de un array, calcular el promedio, encontrar el valor máximo o mínimo, etc.
- Buscar elementos:
- Puedes buscar un elemento específico dentro del array, por ejemplo, encontrar si un determinado número existe en una lista de números aleatorios.
- Modificar elementos:
- Puedes cambiar el valor de los elementos del array, por ejemplo, convertir todos los nombres a mayúsculas.
- Crear nuevos arrays:
- Puedes crear un nuevo array a partir de los elementos de otro, filtrando, transformando o combinando los valores.
En resumen, recorrer un array te permite trabajar con cada elemento de forma individual, lo que te da una gran flexibilidad para realizar todo tipo de operaciones con datos.
2. ¿Cómo recorrer un array en JavaScript?
Existen varios métodos de arreglos en JS para recorrer sus elementos, cada uno con sus particularidades y usos más adecuados:
- Recorrer un array con un bucle for:
- Recorrer un array con un bucle for of:
- Recorrer arrays con bucle while y do…while:
- Recorrer arrays con método .forEach():
- Recorrer arrays con método .map():
- Recorrer arrays con método .filter():
- Recorrer arrays con método .reduce():
- Recorrer arrays con método .find() y .findIndex():
- Recorrer arrays con método .some() y .every():
- Recorrer arrays con método .flatMap():
- Recorrer arrays con método Object.keys()
- Recorrer arrays sparse:
2.1. Recorrer un array con un bucle for:
El bucle for es una herramienta fundamental en JavaScript para recorrer arrays. Permite iterar sobre cada elemento del array, realizando una acción específica en cada iteración.
Se utiliza cuando conoces de antemano cuántas iteraciones necesitas (es decir, la longitud del array).
Ejemplo:
Imagina que tienes un array con los nombres de tus amigos:
let amigos = ["Ana", "Juan", "María", "Pedro"];Lenguaje del código: JavaScript (javascript)
Para saludar a cada uno de ellos, puedes usar un bucle for:
for (let i = 0; i < amigos.length; i++) {
console.log("Hola, " + amigos[i] + "!");
}Lenguaje del código: JavaScript (javascript)
Explicación:
for (let i = 0; i < amigos.length; i++) { ... }: Esta línea inicia el buclefor.let i = 0;: Se declara una variableiy se inicializa en 0. Esta variable servirá como índice para acceder a los elementos del array.i < amigos.length;: Esta condición se verifica en cada iteración. Mientrasisea menor que la longitud del arrayamigos, el bucle continuará.i++: Al final de cada iteración, el valor deise incrementa en 1, pasando al siguiente elemento del array.
console.log("Hola, " + amigos[i] + "!");: Esta línea se ejecuta en cada iteración del bucle.amigos[i]: Accede al elemento del arrayamigosen la posición indicada pori.console.log()muestra un mensaje en la consola, saludando al amigo correspondiente.
¿Qué hace este código?
- Empieza en el primer elemento del array (índice 0).
- Imprime un saludo para ese elemento.
- Incrementa el índice en 1.
- Repetir los pasos 2 y 3 hasta que se hayan recorrido todos los elementos del array.
Salida en la consola:
Hola, Ana!
Hola, Juan!
Hola, María!
Hola, Pedro!
2.2. Recorrer un array con un bucle for of:
El bucle for...of es una forma más moderna y concisa de recorrer arrays en JavaScript, especialmente se usa cuando simplemente quieres iterar sobre los valores de un array sin preocuparte por los índices.
Ejemplo:
Imagina que tienes un array con los nombres de frutas:
let frutas = ["manzana", "banana", "pera", "uva"];Lenguaje del código: JavaScript (javascript)
Para imprimir el nombre de cada fruta en la consola, puedes usar un bucle for...of:
for (let fruta of frutas) {
console.log(fruta);
}Lenguaje del código: JavaScript (javascript)
Explicación:
for (let fruta of frutas) { ... }: Esta línea inicia el buclefor...of.let fruta: Se declara una variablefrutaque tomará el valor de cada elemento del array en cada iteración.of frutas: Indica que se va a iterar sobre cada elemento del arrayfrutas.
console.log(fruta);: Esta línea se ejecuta en cada iteración, imprimiendo el nombre de la fruta actual.
¿Qué hace este código?
- Empieza en el primer elemento del array.
- Asigna el valor del elemento actual a la variable
fruta. - Imprime el valor de
frutaen la consola. - Pasa al siguiente elemento del array y repite los pasos 2 y 3 hasta que se hayan recorrido todos los elementos.
Salida en la consola:
manzana
banana
pera
uva
Ventajas del bucle for...of:
- Más legible: La sintaxis es más concisa y fácil de entender.
- Automático: No necesitas preocuparte por el índice, el bucle se encarga de ello.
- Seguro: No puedes modificar accidentalmente la longitud del array mientras iteras, lo que evita errores comunes.
2.3. Recorrer arrays con bucle while y do…while:
Los bucles while y do...while son otras herramientas útiles para recorrer arrays en JavaScript, aunque son un poco menos comunes que el for y for...of.
2.3.1. Bucle while:
El bucle while ejecuta un bloque de código mientras una condición se evalúe como verdadera.
Se utiliza cuando no sabes exactamente cuántas iteraciones necesitas desde el principio, pero quieres seguir iterando mientras se cumpla una condición.
Ejemplo:
let numeros = [10, 20, 30, 40];
let i = 0;
while (i < numeros.length) {
console.log(numeros[i]);
i++;
}Lenguaje del código: JavaScript (javascript)
Explicación:
- Inicialización: Se crea un contador
iinicializado en 0 para llevar la cuenta de la posición actual en el array. - Condición: El bucle continuará mientras
isea menor que la longitud del arraynumeros. - Cuerpo del bucle:
- Se imprime el elemento actual del array (acceso a través de
numeros[i]). - Se incrementa el contador
ien 1 para pasar al siguiente elemento.
- Se imprime el elemento actual del array (acceso a través de
¿Cuándo usar while?
- Cuando no se conoce de antemano el número exacto de iteraciones.
- Cuando la condición de parada depende de un cálculo más complejo.
2.3.2. Bucle do...while
El bucle do...while es similar al while, pero garantiza que el bloque de código se ejecute al menos una vez, ya que la condición se verifica al final del bucle.
Ejemplo:
let numeros = [10, 20, 30, 40];
let i = 0;
do {
console.log(numeros[i]);
i++;
} while (i < numeros.length);Lenguaje del código: JavaScript (javascript)
Explicación:
Este ejemplo es casi idéntico al del bucle while, pero el bloque de código se ejecutará al menos una vez, incluso si el array numeros está vacío.
¿Cuándo usar do...while?
- Cuando necesitas que un bloque de código se ejecute al menos una vez, independientemente de la condición inicial.
2.4. Recorrer arrays con método .forEach():
El método .forEach() es una forma concisa de iterar sobre cada elemento de un array, ejecutando una función específica para cada uno.
A diferencia de los bucles tradicionales como for o while, .forEach() no devuelve un nuevo array, sino que simplemente ejecuta la función proporcionada para cada elemento.
Ejemplo:
const frutas = ['manzana', 'banana', 'pera'];
frutas.forEach(fruta => {
console.log(fruta);
});Lenguaje del código: JavaScript (javascript)
Explicación:
- Declaración del array: Creamos un array llamado
frutasque contiene los nombres de algunas frutas. - Método .forEach(): Llamamos al método
.forEach()en el arrayfrutas. Este método toma una función como argumento. - Función de callback: La función que pasamos a
.forEach()se ejecuta una vez por cada elemento del array. En este caso, la función recibe un parámetro,fruta, que representa el elemento actual en cada iteración. - Impresión: Dentro de la función, utilizamos
console.log()para imprimir el nombre de la fruta actual.
¿Qué hace este código?
Este código iterará sobre cada elemento del array frutas y, para cada elemento, imprimirá su valor en la consola. La salida sería:
manzana
banana
pera
Ventajas de .forEach():
- Sintaxis concisa: Facilita la lectura y escritura del código.
- No modifica el array original: Útil cuando solo quieres iterar y realizar acciones sin cambiar el array.
- Ideal para efectos secundarios: Perfecto para tareas como imprimir en la consola, actualizar el DOM, etc.
Limitaciones:
- No devuelve un nuevo array: Si necesitas crear un nuevo array a partir de los resultados de la iteración, utiliza
map(). - No se puede interrumpir la iteración: Si necesitas detener la iteración en base a una condición, utiliza un bucle
fortradicional o un método comosome().
2.5. Recorrer arrays con método .map():
El método .map() en JavaScript nos permite transformar un array en otro nuevo, aplicando una función a cada uno de sus elementos.
Es decir, crea un nuevo array con el mismo número de elementos, pero con los valores modificados según la función que le proporcionemos.
Ejemplo:
Imagina que tenemos un array de números y queremos crear un nuevo array donde cada número esté multiplicado por 2:
const numeros = [1, 2, 3, 4, 5];
const numerosDoblados = numeros.map(numero => {
return numero * 2;
});
console.log(numerosDoblados);
// Imprimirá: [2, 4, 6, 8, 10]Lenguaje del código: JavaScript (javascript)
Explicación:
- Declaración del array original: Creamos un array llamado
numeroscon algunos valores numéricos. - Aplicación de .map():
numeros.map()aplica una función a cada elemento del arraynumeros.- La función que pasamos recibe un parámetro,
numero, que representa el elemento actual en cada iteración. - Dentro de la función, multiplicamos
numeropor 2 y retornamos el resultado.
- Creación del nuevo array: El método
.map()crea un nuevo array,numerosDoblados, donde cada elemento es el resultado de aplicar la función a los elementos correspondientes del array original. - Impresión del resultado: Finalmente, imprimimos el nuevo array
numerosDobladosen la consola.
Características clave de .map():
- Crea un nuevo array: Nunca modifica el array original.
- Itera sobre cada elemento: Aplica la función proporcionada a cada elemento del array.
- Retorna un nuevo valor: La función que pasamos a
.map()debe retornar un nuevo valor para cada elemento. - Mantiene el orden: El nuevo array conserva el mismo orden que el array original.
¿Cuándo usar .map()?
- Transformar datos: Para crear un nuevo array con los datos transformados de alguna manera.
- Proyectar datos: Para extraer una propiedad específica de cada objeto en un array.
- Crear nuevos arrays a partir de otros: Para generar arrays derivados de arrays existentes.
2.6. Recorrer arrays con método .filter():
El método .filter() en JavaScript se utiliza para crear un nuevo array a partir de un array existente, pero filtrando los elementos que cumplan una determinada condición. Es decir, te permite seleccionar solo los elementos que sean de tu interés.
Ejemplo:
Imagina que tienes un array de números y quieres obtener solo los números pares:
const numeros = [1, 2, 3, 4, 5, 6];
const numerosPares = numeros.filter(numero => {
return numero % 2 === 0;
});
console.log(numerosPares);
// Imprimirá: [2, 4, 6]Lenguaje del código: JavaScript (javascript)
Explicación:
- Declaración del array: Creamos un array llamado
numeroscon una lista de números. - Aplicación de .filter():
numeros.filter()aplica una función a cada elemento del arraynumeros.- La función que pasamos recibe un parámetro,
numero, que representa el elemento actual en cada iteración. - Dentro de la función, verificamos si el número es par utilizando el operador módulo (
%). Si el resto de la división entre 2 es 0, significa que el número es par. - La función debe retornar
truesi el elemento cumple la condición yfalsesi no la cumple.
- Creación del nuevo array: El método
.filter()crea un nuevo array,numerosPares, donde solo se incluyen los elementos para los cuales la función de filtrado retornótrue. - Impresión del resultado: Finalmente, imprimimos el nuevo array
numerosParesen la consola.
Características clave de .filter():
- Crea un nuevo array: Nunca modifica el array original.
- Itera sobre cada elemento: Aplica la función de filtrado a cada elemento del array.
- Retorna un nuevo array: El nuevo array contiene solo los elementos que cumplen la condición.
- Mantiene el orden: El nuevo array conserva el mismo orden que los elementos en el array original.
¿Cuándo usar .filter()?
- Seleccionar elementos: Para extraer elementos de un array que cumplan ciertos criterios.
- Buscar elementos específicos: Para encontrar elementos que coincidan con una determinada condición.
- Limpiar datos: Para eliminar elementos no válidos o duplicados de un array.
2.7. Recorrer arrays con método .reduce():
El método .reduce() en JavaScript te permite reducir un array a un único valor. Este valor puede ser un número, un string, un objeto o cualquier otro tipo de dato.
La función que proporcionas a .reduce() toma un acumulador y un valor actual, y debe retornar un nuevo valor para el acumulador.
Ejemplo: Sumar todos los elementos de un array
const numeros = [1, 2, 3, 4, 5];
const sumaTotal = numeros.reduce((acumulador, numeroActual) => {
return acumulador + numeroActual;
}, 0);
console.log(sumaTotal);
// Imprimirá: 15Lenguaje del código: JavaScript (javascript)
Explicación:
- Declaración del array: Creamos un array
numeroscon una lista de números. - Aplicación de .reduce():
numeros.reduce()aplica una función a cada elemento del array.- La función recibe dos parámetros:
acumulador: Un valor que se inicializa con el segundo argumento de.reduce()o con el primer elemento del array si no se proporciona un valor inicial.numeroActual: El elemento actual del array en cada iteración.
- Dentro de la función, sumamos el
acumuladory elnumeroActual, y retornamos el resultado. Este resultado se convierte en el nuevo valor delacumuladorpara la siguiente iteración.
- Valor inicial: El segundo argumento de
.reduce(),0en este caso, es el valor inicial del acumulador. Esto es importante cuando el array está vacío o cuando quieres empezar la suma desde un valor diferente a cero. - Resultado final: Después de que se hayan procesado todos los elementos del array, el valor final del acumulador se asigna a la variable
sumaTotal.
Características clave de .reduce():
- Reduce a un valor: Transforma un array en un único valor.
- Acumulador: Utiliza un acumulador para mantener un estado a lo largo de la iteración.
- Flexibilidad: Puede ser utilizado para realizar diversas operaciones, como sumar, restar, multiplicar, concatenar, etc.
- Valor inicial (opcional): Puedes proporcionar un valor inicial para el acumulador.
¿Cuándo usar .reduce()?
- Calcular sumas, promedios, productos: Para realizar operaciones matemáticas sobre los elementos de un array.
- Combinar objetos: Para fusionar múltiples objetos en uno solo.
- Aplanar arrays: Para convertir un array de arrays en un solo array.
- Crear objetos a partir de arrays: Para agrupar elementos de un array en un objeto.
2.8. Recorrer arrays con método .find() y .findIndex():
Los métodos .find() y .findIndex() son herramientas muy útiles en JavaScript cuando queremos encontrar elementos específicos dentro de un array.
2.8.1. Método .find()
El método .find() te permite encontrar el primer elemento de un array que cumpla con una determinada condición. Devuelve ese elemento o undefined si no se encuentra ninguno.
Ejemplo:
const personas = [
{ nombre: 'Juan', edad: 30 },
{ nombre: 'Ana', edad: 25 },
{ nombre: 'Pedro', edad: 35 }
];
const personaEncontrada = personas.find(persona => persona.edad === 35);
console.log(personaEncontrada);
// Imprimirá: { nombre: 'Pedro', edad: 35 }Lenguaje del código: JavaScript (javascript)
Explicación:
- Declaración del array: Creamos un array de objetos, donde cada objeto representa una persona con nombre y edad.
- Aplicación de .find():
personas.find()busca en el arraypersonasel primer elemento que cumpla la condición especificada.- La función que pasamos a
.find()recibe un parámetro,persona, que representa el elemento actual en cada iteración. - Dentro de la función, verificamos si la edad de la persona es igual a 35.
- Si se encuentra un elemento que cumple la condición,
.find()devuelve ese elemento y la búsqueda termina.
- Almacenamiento del resultado: El elemento encontrado se almacena en la variable
personaEncontrada.
2.8.2. Método .findIndex()
El método .findIndex() funciona de manera similar a .find(), pero en lugar de devolver el elemento, devuelve el índice del primer elemento que cumple la condición. Si no se encuentra ningún elemento, devuelve -1.
Ejemplo:
const numeros = [10, 20, 30, 40];
const indiceDelTreinta = numeros.findIndex(numero => numero === 30);
console.log(indiceDelTreinta);
// Imprimirá: 2Lenguaje del código: JavaScript (javascript)
Explicación:
- Declaración del array: Creamos un array de números.
- Aplicación de .findIndex():
numeros.findIndex()busca en el arraynumerosel primer elemento que sea igual a 30.- Si se encuentra el elemento, devuelve su índice (en este caso, 2).
- Si no se encuentra, devuelve -1.
2.8.3. Resumen de las diferencias:
| Método | Devuelve |
|---|---|
.find() | El elemento encontrado |
.findIndex() | El índice del elemento encontrado |
2.8.4. ¿Cuándo usar cada método?
- .find(): Cuando necesitas el valor del elemento encontrado.
- .findIndex(): Cuando necesitas la posición del elemento encontrado (por ejemplo, para modificarlo o eliminarlo).
2.9. Recorrer arrays con método .some() y .every():
Los métodos .some() y .every() son herramientas para realizar comprobaciones sobre todos los elementos de un array y obtener un resultado booleano.
2.9.1. .some()
- ¿Qué hace? Determina si al menos un elemento del array cumple una determinada condición.
- Cuándo usarlo: Cuando necesitas saber si existe algún elemento que satisfaga un criterio específico.
Ejemplo:
const numeros = [1, 2, 3, 4, 5];
const hayNumeroMayorA4 = numeros.some(numero => numero > 4);
console.log(hayNumeroMayorA4);
// Imprimirá: trueLenguaje del código: JavaScript (javascript)
Explicación:
- Declaración del array: Creamos un array de números.
- Aplicación de .some():
numeros.some()itera sobre cada elemento del array.- La función de callback recibe un parámetro,
numero, que representa el elemento actual. - La función retorna
truesi el número es mayor que 4, de lo contrariofalse. - Si alguno de los elementos cumple la condición,
.some()devuelve inmediatamentetruey detiene la iteración.
- Almacenamiento del resultado: El resultado se almacena en
hayNumeroMayorA4.
2.9.2. .every()
- ¿Qué hace? Determina si todos los elementos del array cumplen una determinada condición.
- Cuándo usarlo: Cuando necesitas verificar si todos los elementos satisfacen un criterio específico.
Ejemplo:
const numeros = [1, 2, 3, 4, 5];
const todosLosNumerosSonPositivos = numeros.every(numero => numero > 0);
console.log(todosLosNumerosSonPositivos);
// Imprimirá: trueLenguaje del código: JavaScript (javascript)
Explicación:
- Declaración del array: Igual que en el ejemplo anterior.
- Aplicación de .every():
numeros.every()itera sobre cada elemento del array.- La función de callback recibe un parámetro,
numero, que representa el elemento actual. - La función retorna
truesi el número es mayor que 0, de lo contrariofalse. - Si todos los elementos cumplen la condición,
.every()devuelvetrue. Si encuentra un elemento que no cumple, devuelve inmediatamentefalsey detiene la iteración.
2.9.3. Resumen de las diferencias:
- .some(): Devuelve
truesi al menos un elemento cumple la condición. - .every(): Devuelve
truesi todos los elementos cumplen la condición.
2.9.4. Cuándo usar cada método
- .some():
- Verificar si existe algún elemento que cumpla un criterio.
- Determinar si un array contiene al menos un valor específico.
- .every():
- Verificar si todos los elementos cumplen un criterio.
- Validar que todos los elementos de un array sean del mismo tipo.
2.10. Recorrer arrays con método .flatMap():
El método .flatMap() en JavaScript es una combinación de los métodos .map() y .flat().
Primero, aplica una función de mapeo a cada elemento de un array, como lo hace .map(), y luego aplana el resultado en un nuevo array, eliminando niveles de anidamiento. Es decir, te permite transformar y aplanar un array en una sola pasada.
Ejemplo:
Imagina que tienes un array de arrays, donde cada sub-array representa una lista de tareas para un día de la semana:
const tareasPorDia = [
['Tarea 1', 'Tarea 2'],
['Tarea 3', 'Tarea 4', 'Tarea 5'],
['Tarea 6']
];Lenguaje del código: JavaScript (javascript)
Y quieres obtener un único array con todas las tareas:
const todasLasTareas = tareasPorDia.flatMap(tareas => tareas);
console.log(todasLasTareas);
// Imprimirá: ['Tarea 1', 'Tarea 2', 'Tarea 3', 'Tarea 4', 'Tarea 5', 'Tarea 6']Lenguaje del código: JavaScript (javascript)
Explicación:
- Declaración del array: Creamos un array de arrays,
tareasPorDia, donde cada elemento es un array de tareas. - Aplicación de .flatMap():
tareasPorDia.flatMap()aplica una función de mapeo a cada elemento (cada sub-array).- La función de mapeo simplemente devuelve el sub-array completo (
tareas), ya que queremos mantener cada tarea individual. .flatMap()automáticamente aplana el resultado, creando un nuevo array unidimensional con todas las tareas.
- Almacenamiento del resultado: El nuevo array con todas las tareas se almacena en
todasLasTareas.
Características clave de .flatMap():
- Combina map y flat: Realiza ambas operaciones en una sola pasada.
- Aplana automáticamente: Elimina un nivel de anidamiento.
- Es más eficiente: A menudo es más eficiente que usar
.map()y.flat()por separado.
¿Cuándo usar .flatMap()?
- Aplanar arrays anidados: Cuando tienes un array de arrays y quieres unificarlos en un solo array.
- Transformar y aplanar: Cuando necesitas transformar elementos y al mismo tiempo aplanar el resultado.
- Crear nuevos arrays a partir de arrays anidados: Para generar estructuras de datos más planas.
2.11. Recorrer arrays con método Object.keys()
Aunque Object.keys() está diseñado principalmente para obtener las claves de un objeto, también se puede aplicar a arrays, ya que en JavaScript, los arrays son en realidad objetos especiales con propiedades numéricas como índices.
Ejemplo:
const miArray = ['manzana', 'banana', 'pera'];
// Obtener las claves (índices) del array
const claves = Object.keys(miArray);
// Iterar sobre las claves y acceder a los valores
claves.forEach(clave => {
console.log(miArray[clave]);
});
//Imprimirá:
manzana
banana
peraLenguaje del código: JavaScript (javascript)
Explicación:
- Creación del array: Definimos un array simple con nombres de frutas.
- Obtención de las claves:
Object.keys(miArray)devuelve un array de cadenas que representan las claves enumerables del objetomiArray. En este caso, las claves son los índices numéricos del array: ‘0’, ‘1’, ‘2’.
- Iteración:
- Usamos
forEach()para iterar sobre el array de claves. - En cada iteración, la variable
clavecontiene el índice actual. - Accedemos al valor correspondiente en el array original utilizando la notación de corchetes:
miArray[clave].
- Usamos
EN RESUMEN:
- Si bien
Object.keys()puede ser utilizado para recorrer arrays, es más común y recomendado usar los métodos específicos para arrays comoforEach,map,filter, etc. - Sin embargo, entender cómo funciona
Object.keys()puede ser útil en situaciones más complejas o cuando se necesita un mayor control sobre la iteración.
2.12. Recorrer arrays sparse:
¿Qué son los arrays sparse?
Un array sparse (disperso) es aquel que tiene índices numéricos consecutivos pero no todos sus elementos están definidos. Es decir, hay «huecos» o espacios vacíos en el array. Esto puede ocurrir cuando eliminas elementos de un array o cuando declaras un array con un tamaño específico pero solo inicializas algunas posiciones.
¿Por qué son importantes?
Al recorrer un array sparse, es crucial tener en cuenta estos espacios vacíos, ya que intentar acceder a un elemento que no existe puede generar errores o resultados inesperados.
Ejemplo:
let miArray = [10, , 30]; // El elemento en el índice 1 es undefined
// RECORRIDO TRADICIONAL (no recomendado para arrays sparse)
for (let i = 0; i < miArray.length; i++) {
console.log(miArray[i]); // Imprimirá: 10, undefined, 30
}
// RECORRIDO UTILIZANDO FOR...IN (no recomendado para arrays numéricos)
for (let indice in miArray) {
console.log(miArray[indice]); // Imprimirá lo mismo, pero también podría incluir propiedades heredadas
}
// RECORRIDO RECOMENDADO: utilizando for...of
for (let valor of miArray) {
console.log(valor); // Imprimirá: 10, undefined, 30
}
Lenguaje del código: JavaScript (javascript)
Explicación:
- Recorrido tradicional:
- Aunque funciona, puede llevar a errores si no se maneja adecuadamente el valor
undefined. - No es el método más eficiente para arrays sparse.
- Aunque funciona, puede llevar a errores si no se maneja adecuadamente el valor
- Recorrido con for…in:
- No es recomendado para arrays numéricos, ya que puede iterar sobre propiedades heredadas además de los índices.
- Recorrido con for…of:
- Es la forma más recomendada para recorrer arrays, ya que itera directamente sobre los valores y omite los índices que no tienen un valor asignado.
¿Por qué for…of es la mejor opción?
- Iteración sobre valores: Se enfoca en los valores del array, ignorando los índices vacíos.
- Más conciso: La sintaxis es más limpia y fácil de entender.
- Evita errores: Reduce la posibilidad de errores al no tener que verificar si un índice es válido.
Consideraciones adicionales:
- Métodos como .map(), .filter(), .reduce(): Estos métodos también son útiles para trabajar con arrays sparse, pero es importante tener en cuenta que iterarán sobre todos los elementos, incluidos los
undefined. - Arrays asociativos: Si estás trabajando con arrays asociativos (objetos con índices numéricos),
Object.keys()te puede ayudar a obtener las claves y luego iterar sobre ellas. - Performance: En la mayoría de los casos, la diferencia de rendimiento entre los diferentes métodos de recorrido es mínima. Sin embargo, para arrays muy grandes, puede haber pequeñas variaciones.
RESUMEN: Al trabajar con arrays sparse, es fundamental elegir el método de recorrido adecuado para evitar errores y obtener resultados correctos. El bucle for...of es generalmente la mejor opción, ya que se enfoca en los valores y omite los índices vacíos.
3. Buenas prácticas al recorrer arrays en JavaScript.
Trabajar con arrays de manera profesional implica seguir ciertas buenas prácticas que mejoran la legibilidad, el mantenimiento del código y la eficiencia. Aquí se detallan los puntos mencionados:
- Evita mutar el array original
- Comprende la complejidad temporal
- Usa funciones puras
- Resumen de buenas prácticas
3.1. Evita mutar el array original
¿Qué significa «mutar el array original»?
Mutar un array ocurre cuando cambias sus elementos directamente o modificas su estructura, como agregar, eliminar o reemplazar elementos sin crear una copia.
Por qué evitarlo:
- Puede llevar a errores difíciles de rastrear, especialmente en proyectos grandes o cuando el array es compartido por múltiples partes del código.
- Reduce la predictibilidad y seguridad del código.
Ejemplo de mala práctica:
let numeros = [1, 2, 3];
for (let i = 0; i < numeros.length; i++) {
numeros[i] *= 2; // Modifica directamente el array original
}
console.log(numeros); // [2, 4, 6]Lenguaje del código: JavaScript (javascript)
- Solución: Usar métodos como
.map()o.filter()
Estos métodos crean un nuevo array en lugar de alterar el existente.- Ejemplo con
.map():
- Ejemplo con
let numeros = [1, 2, 3];
let numerosDoblados = numeros.map(numero => numero * 2);
console.log(numeros); // [1, 2, 3] (no cambia)
console.log(numerosDoblados); // [2, 4, 6]Lenguaje del código: JavaScript (javascript)
- Ejemplo con
.filter():
let numeros = [1, 2, 3, 4];
let pares = numeros.filter(numero => numero % 2 === 0);
console.log(numeros); // [1, 2, 3, 4] (original intacto)
console.log(pares); // [2, 4]Lenguaje del código: JavaScript (javascript)
3.2. Comprende la complejidad temporal
¿Qué es la complejidad temporal?
Se refiere a la cantidad de tiempo que toma ejecutar una operación en función del tamaño del array.
Por qué es importante:
- Métodos funcionales como
.map()o.filter()son más legibles, pero cada llamada a una función introduce una capa adicional de procesamiento. - En arrays grandes, esto puede impactar el rendimiento, especialmente en operaciones anidadas o redundantes.
Ejemplo de ineficiencia:
let numeros = [1, 2, 3, 4, 5];
// Ineficiente: Recorrido múltiple
let resultado = numeros
.filter(numero => numero % 2 === 0)
.map(numero => numero * 2);
console.log(resultado); // [4, 8]Lenguaje del código: JavaScript (javascript)
¿Por qué este ejemplo es mas ineficiente?
- Proceso interno:
.filter()recorre todo el array (numeros) una vez para evaluar la condiciónnumero % 2 === 0, creando un nuevo array con los elementos que cumplen la condición ([2, 4])..map()recorre este nuevo array ([2, 4]) nuevamente para aplicar la operaciónnumero * 2.
- Complejidad temporal:
.filter()tiene una complejidad de O(n) porque recorre todo el array una vez..map()también tiene una complejidad de O(n) porque recorre el nuevo array una vez.- En total, el tiempo es O(n) + O(m), donde
nes el tamaño del array original ymel tamaño del nuevo array generado por.filter().
Optimización: Combina operaciones cuando sea posible para reducir el número de iteraciones
let numeros = [1, 2, 3, 4, 5];
// Más eficiente: Un solo recorrido
let resultado = [];
for (let numero of numeros) {
if (numero % 2 === 0) {
resultado.push(numero * 2);
}
}
console.log(resultado); // [4, 8]Lenguaje del código: JavaScript (javascript)
¿Por qué este ejemplo es mas eficiente?
- Proceso interno:
- Se recorre el array una sola vez con el bucle
for...of, evaluando la condiciónnumero % 2 === 0y aplicando la operaciónnumero * 2en una sola pasada.
- Se recorre el array una sola vez con el bucle
- Complejidad temporal:
- El bucle
for...oftiene una complejidad de O(n), ya que se realiza un único recorrido.
- El bucle
3.3. Usa funciones puras
¿Qué es una función pura?
Una función es pura si:
- Su salida depende únicamente de sus argumentos (sin depender de variables externas).
- No tiene efectos secundarios (como modificar variables globales o mutar objetos/arrays pasados como referencia).
Por qué es importante:
- Las funciones puras son más predecibles, fáciles de probar y depurar.
- Garantizan que métodos como
.map(),.filter(), y.reduce()se comporten de manera consistente.
Ejemplo de función impura (mala práctica):
let acumulador = 0;
let numeros = [1, 2, 3];
let resultado = numeros.map(numero => {
acumulador += numero; // Efecto secundario
return numero * 2;
});
console.log(acumulador); // 6 (difícil de rastrear)Lenguaje del código: JavaScript (javascript)
¿Por qué decimos que este ejemplo es impura?:
- Es una función impura porque:
- La función anónima utilizada en
.map()modifica la variable externaacumulador. Este es un efecto secundario, ya que la variableacumuladorno está definida dentro de la función. - Si ejecutas esta misma función en otro contexto o en paralelo, el valor de
acumuladordependerá del estado previo, lo que genera resultados impredecibles.
- La función anónima utilizada en
- Problemas generados:
- Dificultad para depurar: Si algo sale mal, es difícil rastrear cómo y dónde cambió el valor de
acumulador. - Dependencia del estado global: La función no es autónoma; su comportamiento depende de una variable externa.
- No reutilizable: No puedes usar esta función en otro contexto sin preocuparte por los efectos en
acumulador.
- Dificultad para depurar: Si algo sale mal, es difícil rastrear cómo y dónde cambió el valor de
Ejemplo de función pura (buena práctica):
let numeros = [1, 2, 3];
let resultado = numeros.map(numero => numero * 2); // Sin efectos secundarios
console.log(resultado); // [2, 4, 6]Lenguaje del código: JavaScript (javascript)
¿Por qué este ejemplos es una función pura?:
- Es una función pura porque:
- La función proporcionada a
.map()no tiene efectos secundarios; no modifica variables externas ni el estado global. - Su resultado depende únicamente del parámetro
numeroy siempre produce el mismo resultado dado el mismo input.
- La función proporcionada a
- No mutación del array original:
.map()crea un nuevo array (resultado) en lugar de modificar el array original (numeros), lo que respeta el principio de inmutabilidad, fundamental para escribir código predecible y mantenible.
- Legibilidad y simplicidad:
- El propósito de la operación es claro: transformar cada elemento de
numerosmultiplicándolo por 2. - El código es conciso y fácil de entender.
- El propósito de la operación es claro: transformar cada elemento de
- Reutilización y escalabilidad:
- La función usada dentro de
.map()(numero => numero * 2) es reutilizable y puede integrarse en otros contextos sin dependencia de variables externas.
- La función usada dentro de
3.4. Resumen de buenas prácticas
- Evita mutar el array original para mantener la integridad de los datos.
- Comprende la complejidad temporal y optimiza recorridos para mejorar el rendimiento en arrays grandes.
- Usa funciones puras para garantizar un código más seguro, predecible y fácil de depurar.
4. Preguntas frecuentes y resumen sobre cómo recorrer un array en JS.
Para recorrer un array con for, se usa: for (let i = 0; i < arr.length; i++) { console.log(arr[i]); }. Esto permite acceder a cada elemento por su índice y modificarlo si es necesario.
El método forEach() recorre el array ejecutando una función en cada elemento: arr.forEach((valor) => console.log(valor));. No devuelve un nuevo array y no permite detener el ciclo.
El método map() recorre el array y devuelve un nuevo array con los resultados de aplicar una función: let nuevoArr = arr.map(num => num * 2);. Es útil para transformaciones sin modificar el original.
El método filter() crea un nuevo array con los elementos que cumplen una condición: let mayores = arr.filter(num => num > 10);. Filtra sin modificar el array original.
reduce() recorre un array y acumula un valor: let total = arr.reduce((acc, num) => acc + num, 0);. Se usa para sumar, contar o transformar datos en una sola salida.
Con for...of se recorre directamente el valor de cada elemento: for (let valor of arr) { console.log(valor); }. Es más limpio que for cuando no se necesita el índice.
Para recorrer un array en orden inverso, se usa un bucle for: for (let i = arr.length - 1; i >= 0; i--) { console.log(arr[i]); }. También se puede usar arr.reverse(), pero modifica el original.
Para recorrer un array bidimensional, se usan bucles anidados: for (let fila of matriz) { for (let valor of fila) { console.log(valor); } }. También se puede usar forEach() en cada nivel.
Se usa forEach() con dos parámetros: arr.forEach((valor, i) => console.log(i, valor));. También con for: for (let i = 0; i < arr.length; i++) { console.log(i, arr[i]); }.
for es flexible pero más largo. forEach() es más limpio pero no devuelve un nuevo array. map() transforma, filter() selecciona y reduce() acumula valores, optimizando el código.
