Arrays en JavaScript: de listas simples a transformaciones limpias
Los arrays son una de las estructuras más usadas en JavaScript porque representan listas: productos, posts, usuarios, mensajes, tareas, resultados de una API o filas de una tabla. Al principio parecen fáciles, pero en proyectos reales la diferencia está en saber cuándo mutar, cuándo crear una copia y qué método expresa mejor la intención.
Crear arrays y acceder a datos
La forma más común de crear un array es con corchetes:
const fruits = ['apple', 'banana', 'orange'];
console.log(fruits[0]); // "apple"
console.log(fruits.length); // 3
Los índices empiezan en 0, así que el último elemento está en array.length - 1. También puedes usar at() para leer desde el final de forma más clara:
console.log(fruits.at(-1)); // "orange"
Mutar o no mutar
Algunos métodos modifican el array original:
const numbers = [1, 2, 3];
numbers.push(4);
numbers.pop();
numbers.sort();
Otros devuelven un nuevo array:
const numbers = [1, 2, 3];
const doubled = numbers.map((number) => number * 2);
console.log(numbers); // [1, 2, 3]
console.log(doubled); // [2, 4, 6]
Esta diferencia importa mucho en frameworks como React, donde normalmente quieres crear nuevas referencias para que la UI detecte cambios correctamente.
map, filter y reduce
Estos tres métodos cubren gran parte del trabajo diario con listas.
map() transforma cada elemento:
const users = [
{ name: 'Ana', active: true },
{ name: 'Luis', active: false },
];
const names = users.map((user) => user.name);
console.log(names); // ["Ana", "Luis"]
filter() conserva solo los elementos que cumplen una condición:
const activeUsers = users.filter((user) => user.active);
reduce() acumula un resultado. Es útil cuando quieres calcular un total o convertir una lista en otro formato:
const cart = [
{ product: 'Keyboard', price: 80 },
{ product: 'Mouse', price: 40 },
];
const total = cart.reduce((sum, item) => sum + item.price, 0);
console.log(total); // 120
No uses reduce() para todo. Si map() o filter() hacen el trabajo de forma más clara, son mejores opciones.
Buscar elementos
Para saber si existe un valor simple, usa includes():
const roles = ['admin', 'editor', 'reader'];
console.log(roles.includes('admin')); // true
Para objetos, usa find() o some():
const posts = [
{ slug: 'arrays', published: true },
{ slug: 'draft', published: false },
];
const post = posts.find((item) => item.slug === 'arrays');
const hasDrafts = posts.some((item) => !item.published);
find() devuelve el elemento. some() devuelve un booleano. Elegir el método correcto hace que el código se lea casi como una frase.
Copias, slice y spread
Si necesitas agregar o quitar elementos sin modificar el original, puedes crear copias:
const original = ['React', 'Astro'];
const updated = [...original, 'Node.js'];
console.log(original); // ["React", "Astro"]
console.log(updated); // ["React", "Astro", "Node.js"]
slice() también devuelve una copia parcial:
const firstTwo = updated.slice(0, 2);
Esto es más predecible que mutar una lista compartida por varias partes de la aplicación.
Ordenamiento: cuidado con sort
sort() muta el array y convierte valores a string si no le pasas una función de comparación:
const numbers = [10, 2, 30];
console.log(numbers.sort()); // [10, 2, 30] como strings
Para números:
const sorted = [...numbers].sort((a, b) => a - b);
console.log(sorted); // [2, 10, 30]
La copia con [...] evita modificar el array original.
Performance y legibilidad
En listas pequeñas, prioriza claridad. En listas muy grandes o código que corre muchas veces por segundo, evita recorrer la misma lista cinco veces sin necesidad. Por ejemplo, encadenar filter().map().sort() es legible, pero cada paso crea trabajo. Si notas un problema real de performance, mide primero y optimiza después.
Buenas prácticas
- Usa
mappara transformar,filterpara seleccionar yreducepara acumular. - Evita mutar arrays compartidos si el dato alimenta una UI o un estado.
- Usa
findcuando necesitas el elemento ysomecuando solo necesitas saber si existe. - Copia antes de ordenar si no quieres modificar el array original.
- No uses
forEachcuando necesitas devolver un nuevo array; probablemente buscasmap. - Mantén los callbacks pequeños y legibles.
Conclusión
Los arrays son mucho más que una lista de valores. Bien usados, permiten escribir transformaciones claras y predecibles. El salto de calidad aparece cuando eliges el método por intención, controlas la mutación y haces que cada operación explique qué está pasando con los datos.