Arrays en JavaScript: métodos, ejemplos y ejercicios

Actualizado el 29 de septiembre de 2026

Un array es una lista ordenada de valores: los productos de un carrito, los mensajes de un chat o las filas que devuelve una API. En JavaScript los arrays traen decenas de métodos, y saber cuál usar en cada caso es buena parte de escribir código claro.

Esta guía parte por lo básico (crear, leer, agregar y quitar) y sigue con los métodos que más se usan en código real: map, filter, find, reduce y sort. Al final hay tres ejercicios resueltos.

Crear un array y leer sus elementos

Un array se escribe entre corchetes. Los índices empiezan en 0 y la propiedad length indica cuántos elementos tiene. Para leer desde el final, at() acepta índices negativos.

const colores = ["rojo", "verde", "azul"];

colores[0];      // "rojo"
colores.length;  // 3
colores.at(-1);  // "azul"
colores[5];      // undefined (no lanza error)

A diferencia de otros lenguajes, leer una posición que no existe no produce un error: devuelve undefined. Eso hace que algunos errores pasen inadvertidos hasta más adelante.

Agregar y quitar elementos

Estos métodos modifican el array original (lo mutan):

const numeros = [1, 2, 3];

numeros.push(4);      // agrega al final        → [1, 2, 3, 4]
numeros.pop();        // quita el último (4)    → [1, 2, 3]
numeros.unshift(0);   // agrega al principio    → [0, 1, 2, 3]
numeros.shift();      // quita el primero (0)   → [1, 2, 3]

const letras = ["a", "b", "c", "d", "e"];
letras.splice(1, 2);      // desde la posición 1 quita 2: devuelve ["b", "c"]
// letras → ["a", "d", "e"]
letras.splice(1, 0, "x"); // en la posición 1 quita 0 e inserta "x"
// letras → ["a", "x", "d", "e"]

Declarar un array con const no lo vuelve inmutable: const impide reasignar la variable, pero push, pop o splice siguen funcionando sobre el mismo array.

Recorrer un array

const colores = ["rojo", "verde", "azul"];

for (const color of colores) {
  console.log(color);
}

colores.forEach((color, i) => {
  console.log(i, color);
});

for...of es la opción más simple y permite usar break. forEach entrega también el índice, pero no se puede detener a la mitad y no devuelve nada: sirve para hacer algo con cada elemento, no para transformar el array.

map, filter y find: transformar y buscar

Estos métodos no modifican el array original: reciben una función y devuelven un resultado nuevo. Son la base de la mayoría del código que trabaja con listas de datos.

const precios = [1200, 3500, 800, 5000];

// map: aplica la función a cada elemento y devuelve un array del mismo largo
precios.map((p) => Math.round(p * 1.19));  // [1428, 4165, 952, 5950]

// filter: se queda con los elementos para los que la función devuelve true
precios.filter((p) => p > 1000);           // [1200, 3500, 5000]

// find: devuelve el primer elemento que cumple (o undefined)
precios.find((p) => p > 3000);             // 3500
precios.findIndex((p) => p > 3000);        // 1

// some / every: ¿alguno cumple? ¿todos cumplen?
precios.some((p) => p < 1000);             // true
precios.every((p) => p < 1000);            // false
precios.includes(800);                     // true

Para copiar o unir arrays sin modificar el original sirven slice() y el operador spread: precios.slice(1, 3) devuelve [3500, 800] y [...precios, 200] crea un array nuevo con un elemento más.

reduce: combinar todo en un solo valor

reduce recorre el array llevando un acumulador. La función recibe el acumulado hasta ahora y el elemento actual, y devuelve el nuevo acumulado. El segundo argumento es el valor inicial.

const precios = [1200, 3500, 800, 5000];

const total = precios.reduce((acumulado, p) => acumulado + p, 0);
// total → 10500

Pasa siempre el valor inicial. Sin él, reduce usa el primer elemento como acumulador y, si el array está vacío, lanza TypeError: Reduce of empty array with no initial value.

sort: ordenar (con cuidado)

sort() ordena el array original y, si no le pasas una función de comparación, convierte todo a texto y ordena alfabéticamente. Con números, el resultado sorprende:

[10, 9, 1, 100].sort();                  // [1, 10, 100, 9]
[10, 9, 1, 100].sort((a, b) => a - b);   // [1, 9, 10, 100]
[10, 9, 1, 100].sort((a, b) => b - a);   // [100, 10, 9, 1]

La función de comparación devuelve un número negativo si a va antes, positivo si va después y 0 si da igual. Si no quieres modificar el original, toSorted() hace lo mismo pero devuelve un array nuevo.

Errores comunes

Usar sort() sin función de comparación

Además del problema con los números, el orden por defecto compara códigos de caracteres: las letras con tilde quedan al final. ["Valentina", "Álvaro", "Ignacia"].sort() devuelve ["Ignacia", "Valentina", "Álvaro"]. Para texto en español usa sort((a, b) => a.localeCompare(b)).

Olvidar el return dentro de map

[1, 2, 3].map((n) => { n * 2; });         // [undefined, undefined, undefined]
[1, 2, 3].map((n) => { return n * 2; });  // [2, 4, 6]
[1, 2, 3].map((n) => n * 2);              // [2, 4, 6]

Con llaves, una función flecha necesita return explícito. Sin llaves, devuelve la expresión automáticamente.

Usar forEach para transformar

forEach siempre devuelve undefined, así que const dobles = numeros.forEach((n) => n * 2) deja dobles en undefined. Si quieres un array nuevo, el método es map.

Comparar arrays con ===

[1, 2] === [1, 2] es false: === compara si son el mismo array en memoria, no si tienen el mismo contenido. Por la misma razón, const b = a no copia el array; para copiarlo usa [...a] o a.slice().

Ejercicios resueltos

Intenta resolver cada ejercicio antes de abrir la solución: equivocarse y corregir es la parte que más enseña.

1.Promedio de un array

Escribe una función promedio(numeros) que devuelva el promedio de los números del array. Si el array está vacío, debe devolver 0.

  • promedio([4, 5, 6]) → 5
  • promedio([1, 2]) → 1.5
  • promedio([]) → 0
Punto de partida
function promedio(numeros) {
  // ...
}
Ver solución
Solución
function promedio(numeros) {
  if (numeros.length === 0) return 0;
  const suma = numeros.reduce((acumulado, n) => acumulado + n, 0);
  return suma / numeros.length;
}

reduce suma todos los elementos partiendo de 0 y después se divide por la cantidad. El caso vacío se resuelve antes, porque dividir 0 entre 0 da NaN, no 0.

2.Nombres de las personas mayores de edad

Escribe una función nombresMayores(personas) que reciba un array de objetos { nombre, edad } y devuelva los nombres de quienes tienen 18 años o más, ordenados alfabéticamente.

Ejemplo
nombresMayores([
  { nombre: "Valentina", edad: 22 },
  { nombre: "Tomás", edad: 15 },
  { nombre: "Álvaro", edad: 30 },
  { nombre: "Ignacia", edad: 18 },
]);
// → ["Álvaro", "Ignacia", "Valentina"]
Punto de partida
function nombresMayores(personas) {
  // ...
}
Ver solución
Solución
function nombresMayores(personas) {
  return personas
    .filter((persona) => persona.edad >= 18)
    .map((persona) => persona.nombre)
    .sort((a, b) => a.localeCompare(b));
}

Se encadenan tres pasos, cada uno sobre el resultado del anterior: filter deja a los mayores de edad, map se queda solo con el nombre y sort los ordena. Encadenar métodos así es muy común y se lee de arriba hacia abajo.

El detalle está en el orden: con sort() a secas, "Álvaro" quedaría al final por la tilde. localeCompare ordena como lo haría una persona. Además, sort aquí no afecta el array original, porque map ya devolvió uno nuevo.

3.Agrupar palabras por largo

Escribe una función agruparPorLargo(palabras) que devuelva un objeto cuyas claves sean los largos de las palabras y cuyos valores sean arrays con las palabras de ese largo, en el orden original.

Ejemplo
agruparPorLargo(["sol", "mar", "perro", "luz", "gato"]);
// → { 3: ["sol", "mar", "luz"], 4: ["gato"], 5: ["perro"] }
Punto de partida
function agruparPorLargo(palabras) {
  // ...
}
Ver solución
Solución
function agruparPorLargo(palabras) {
  return palabras.reduce((grupos, palabra) => {
    const largo = palabra.length;
    if (!grupos[largo]) grupos[largo] = [];
    grupos[largo].push(palabra);
    return grupos;
  }, {});
}

reduce no sirve solo para sumar: el acumulador puede ser cualquier cosa, en este caso un objeto que parte vacío. Para cada palabra se crea el grupo si todavía no existe y se agrega la palabra. Lo importante es devolver grupos en cada vuelta; si se te olvida, la siguiente vuelta recibe undefined.

Las versiones recientes de JavaScript traen Object.groupBy(palabras, (p) => p.length), que hace exactamente esto. Vale la pena saber escribirlo a mano igual: el patrón aparece en muchos otros problemas.

Practica JavaScript con ejercicios a tu nivel

En Coditer resuelves ejercicios en el navegador, con tests automáticos que revisan tu código y una IA que te da pistas cuando te atascas. Practicar es gratis.