Desarrollo Web

Métodos de arrays en JavaScript que todo desarrollador debe conocer

Jairo
6 min de lectura
Métodos de arrays en JavaScript que todo desarrollador debe conocer

1) Crear, clonar y preparar arrays

Cuando construyo pipelines de datos, empiezo por asegurar que el array está en el formato correcto. Si solo necesito un snapshot, clono antes de tocar nada para evitar efectos colaterales.

Array.of(...valores)
Crea un array a partir de argumentos sueltos (sin rarezas de Array(3)).

const ids = Array.of(101, 102, 103); // [101, 102, 103]

Array.from(iterable, mapFn?)
Convierte iterables/parecidos a array y puede mapear en la misma llamada.

const numeros = Array.from('12345', ch => Number(ch)); // [1,2,3,4,5]
const nodos   = Array.from(document.querySelectorAll('li')); // NodeList -> Array

Clonar sin sorpresas
Cuando solo voy a presentar u ordenar temporalmente, clono:

const clon1 = arr.slice();
const clon2 = [...arr];

fill(valor, inicio?, fin?) (muta)
Útil para mocks y pruebas rápidas.

const placeholders = new Array(5).fill(null); // [null, null, null, null, null]

En mi rutina, clono antes de ordenar y antes de pruebas destructivas. Si algo “rompe” referencias, que sea porque yo lo decidí.

2) Verificar el tipo y acceder a posiciones con claridad

Array.isArray(x)
Comprueba sin dudas si algo es o no un array.

Array.isArray([]);        // true
Array.isArray('[]');      // false

at(indice)
Índices positivos y negativos con legibilidad top.

const datos = [10, 20, 30, 40];
datos.at(0);   // 10
datos.at(-1);  // 40 (último)

3) Búsqueda y comprobaciones (rápidas y expresivas)

La regla que me evita bugs: si necesito un elemento, find; si espero varios, filter; si es una mera comprobación, some/every.

indexOf(valor, desde?) / lastIndexOf(valor, desde?)
Encuentran posición por valor primitivo.

['a','b','a'].indexOf('a');     // 0
['a','b','a'].lastIndexOf('a'); // 2

includes(valor, desde?)
¿Está o no está? Perfecto para whitelists/blacklists.

[1,2,3].includes(2); // true

find(fn) / findIndex(fn)
Elementos e índices por condición.

const users = [{id:1,n:'Ana'},{id:2,n:'Luis'}];
users.find(u => u.id === 2);       // {id:2,n:'Luis'}
users.findIndex(u => u.id === 2);  // 1

findLast(fn) / findLastIndex(fn) (moderno)
Busca la última coincidencia que cumpla la condición.

[1,2,3,2].findLast(n => n === 2);      // 2
[1,2,3,2].findLastIndex(n => n === 2); // 3

some(fn) / every(fn)
Validaciones en un golpe de vista.

[1,3,5].some(n => n%2===0);  // false (¿alguno par?)
[2,4,6].every(n => n%2===0); // true  (¿todos pares?)

Cuando solo necesito la primera coincidencia, prefiero find sobre filter: menos trabajo y más intención.

4) Transformación y reducción: el pipeline que más uso

Yo trabajo con un mantra: filtrar → transformar → reducir. Si transformas sin filtrar, acabas haciendo trabajo de más.

map(fn)
Transforma elemento a elemento (no muta).

const preciosConIVA = precios.map(p => p * 1.12);

filter(fn)
Selecciona lo que vale la pena.

const activos = usuarios.filter(u => u.activo);

flatMap(fn)
Mapeo + aplanado de un nivel (ideal para dividir cadenas, expandir colecciones).

const palabras = ['hola mundo', 'adios mundo'].flatMap(t => t.split(' '));
// ['hola','mundo','adios','mundo']

reduce(fn, inicial)
Acumula a un único resultado: totales, diccionarios, agrupaciones.

const total = carrito.reduce((acc, item) => acc + item.precio * item.qty, 0);

reduceRight(fn, inicial)
Reduce desde el final (útil en parsers o composición de funciones).

['a','b','c'].reduceRight((acc, ch) => acc + ch, ''); // 'cba'

forEach(fn)
Para efectos secundarios: logs, métricas, disparar eventos. No devuelve array.

items.forEach(i => registrarVista(i.id));

Patrón de encadenamiento típico

const totalActivos = items
  .filter(i => i.activo)                 // 1) me quedo con lo importante
  .map(i => i.precio * i.cantidad)       // 2) transformo
  .reduce((acc, n) => acc + n, 0);       // 3) acumulo

En mis proyectos, este orden me ahorra sorpresas y hace el código autoexplicativo.

5) Ordenar, invertir y “versiones inmutables” modernas

Aquí se rompen más cosas de las que parece. sort y reverse mutan el array. Si solo quiero una versión ordenada para pintar, uso las alternativas modernas.

sort(compareFn?) (muta)
Para números, siempre comparador.

const nums = [10, 1, 2];
nums.sort((a,b) => a - b); // [1,2,10]

Orden múltiple estable

data.sort((a,b) => a.prioridad - b.prioridad || a.nombre.localeCompare(b.nombre));

reverse() (muta)
Invierte el orden.

const r = [1,2,3]; r.reverse(); // [3,2,1]

toSorted(compareFn?) (no muta)
Devuelve una copia ordenada.

const ordenados = numeros.toSorted((a,b) => a - b); // numeros queda intacto

toReversed() (no muta)
Devuelve una copia invertida.

const invertidos = numeros.toReversed();

Cuidado con sort: sin comparador, los números quedan mal ordenados (como texto). Si no quiero tocar el original, toSorted es mi elección.

6) Recortar, insertar y copiar dentro (cirugía controlada)

slice(inicio?, fin?) (no muta)
Recorta y también clona rápido.

const top5 = arr.slice(0, 5);
const clon = arr.slice();

splice(inicio, borrar, ...insertar) (muta)
Inserta y borra en caliente.

const a = [1,2,4];
a.splice(2, 0, 3); // [1,2,3,4]
a.splice(1, 2);    // [1,4]

toSpliced(inicio, borrar, ...insertar) (no muta)
Hace lo de splice pero devolviendo una copia.

const nuevo = a.toSpliced(1, 2, 99); // a queda igual; nuevo aplica los cambios

copyWithin(destino, inicio?, fin?) (muta)
Copia un rango dentro del mismo array, útil para buffers.

const b = [1,2,3,4,5];
b.copyWithin(0, 3); // [4,5,3,4,5]

with(index, value) (no muta)
Devuelve una copia con el elemento reemplazado.

const c = [0,1,2];
const d = c.with(1, 99); // c=[0,1,2]; d=[0,99,2]

7) Agregar y quitar en extremos (pila y cola)

Cuando necesito estructuras tipo stack o queue, me fijo en el costo de cada operación. En general, push/pop son más baratos que shift/unshift porque estos últimos reindexan.

push(...items) / pop() (mutan)
Final del array.

const pila = [];
pila.push('a'); // ['a']
pila.push('b'); // ['a','b']
pila.pop();     // ['a']

unshift(...items) / shift() (mutan)
Inicio del array.

const cola = [2,3];
cola.unshift(1); // [1,2,3]
cola.shift();    // [2,3]

Si busco rendimiento en colas grandes, a veces mantengo un índice de lectura en lugar de usar shift() repetidamente.

8) Unir, convertir a texto y aplanar

concat(...arrays) (no muta)
Une arrays sin sorpresas (o usa el operador spread).

const combinado = arr1.concat(arr2, arr3);
// o
const combinado2 = [...arr1, ...arr2, ...arr3];

join(separador)
Texto CSV o visualizaciones rápidas.

['a','b','c'].join(','); // 'a,b,c'

toString() / toLocaleString()
Versiones de texto simples o localizadas.

[123456.78].toLocaleString('es-ES'); // '123.456,78'

flat(profundidad=1)
Aplana niveles.

[1,[2,[3]]].flat();   // [1,2,[3]]
[1,[2,[3]]].flat(2);  // [1,2,3]

9) Iteradores, desestructuración y utilidades de recorrido

keys() / values() / entries()
Iteradores limpios para recorrer índices, valores o pares.

const arr = ['a','b'];
for (const i of arr.keys()) console.log(i);        // 0, 1
for (const v of arr.values()) console.log(v);      // 'a', 'b'
for (const [i,v] of arr.entries()) console.log(i,v); // 0 'a', 1 'b'

Desestructuración con rest
Para quedarte con partes útiles y el resto.

const [primero, ...resto] = [10,20,30]; // primero=10, resto=[20,30]

10) Patrones avanzados que realmente uso en proyectos

Aquí es donde un desarrollador pasa de “sé la API” a “sé aplicar la API”.

10.1 Agrupar y sumar por clave con reduce

const ventas = [
  {cat:'A', total: 10}, {cat:'B', total: 5}, {cat:'A', total: 3}
];
const porCat = ventas.reduce((acc, v) => {
  acc[v.cat] = (acc[v.cat] ?? 0) + v.total;
  return acc;
}, {});
// { A: 13, B: 5 }

Cuándo usarlo: dashboards, reportes, agregaciones.

10.2 Búsqueda y eliminación segura por id

const i = usuarios.findIndex(u => u.id === 42);
if (i !== -1) usuarios.splice(i, 1); // muta a propósito

Consejo: documenta la mutación para el equipo.

10.3 Orden estable por varios campos (y sin romper el original)

const ordenados = [...data].sort(
  (a,b) => a.prioridad - b.prioridad || a.nombre.localeCompare(b.nombre)
);

Alternativa moderna: const ordenados = data.toSorted((a,b)=>...);

10.4 Duplicados únicos con Set y flat

const unico = [...new Set(matriz.flat())];

Uso típico: filtros únicos para UI.

10.5 Pipe legible con nombres intermedios (cuando la cadena es larga)

const activos   = usuarios.filter(u => u.activo);
const vistados  = activos.map(u => ({...u, nombre: u.nombre.toUpperCase()}));
const resultado = vistados.reduce((acc, u) => acc + (u.credito ?? 0), 0);

Idea: si encadenas >5 pasos, nómbralos. Depuras más rápido.

10.6 Validaciones limpias con some y every

const tieneStock = items.some(x => x.stock > 0);
const todoValido = items.every(x => x.precio >= 0);

Me encanta para formularios y lógica de negocio simple.

10.7 Mapear y aplanar colecciones relacionadas

const cursos = [
  {alumnos:['Ana','Luis']},
  {alumnos:['Mara','Tom']}
];
const todos = cursos.flatMap(c => c.alumnos); // ['Ana','Luis','Mara','Tom']

11) Errores frecuentes (y cómo los evito ahora)

  1. Usar forEach para transformar. Solución: map.
  2. Ordenar números sin comparador. Solución: (a,b)=>a-b.
  3. Mutar sin querer con sort, reverse, splice, fill, copyWithin. Solución: clona o usa toSorted/toReversed/toSpliced/with.
  4. Usar filter cuando solo quieres uno. Solución: find.
  5. Confiar en includes con objetos. Solución: compara por id o clave.
  6. reduce sin valor inicial con arrays vacíos. Solución: pasa siempre un inicial (p. ej., 0 o {}).
  7. Aplanar demasiado con flat(Infinity). Solución: define la profundidad que necesitas.
  8. Mezclar mutabilidad sin intención en equipos. Solución: acordar una guía: inmutable por defecto.
  9. Olvidar at(-1) y escribir expresiones crípticas. Solución: abraza APIs expresivas.
  10. Encadenar sin control y perder legibilidad. Solución: nombra pasos intermedios.
Mi rutina diaria: primero filtro lo que importa y después transformo. filter me devuelve un nuevo array y map no toca el original. forEach es para efectos secundarios, y con sort uso comparador siempre.

12) FAQ ampliadas (SEO-friendly)

¿Qué diferencia práctica hay entre find y filter?
find retorna un elemento o undefined (primera coincidencia); filter retorna un array con todas las coincidencias. Si solo necesitas una, find es más claro y eficiente.

¿Cómo ordeno números correctamente en JavaScript?
Siempre pasa un comparador: arr.sort((a,b)=>a-b). Si no quieres mutar el original, usa arr.toSorted((a,b)=>a-b).

¿Cuándo preferir flatMap frente a map + flat?
Cuando necesitas mapear y aplanar en una sola pasada, ganando legibilidad y rendimiento.

¿push/pop o shift/unshift?
push/pop generalmente son más baratos. shift/unshift reindexan y pueden ser costosos en arrays grandes.

¿Cómo reemplazo un elemento sin mutar el array?
Con with(index, value): devuelve una copia con el elemento cambiado.

¿Cómo puedo crear un array desde algo que no es array?
Array.from(iterable) convierte iterables (NodeList, cadenas, Sets) a arrays y puede mapear con su segundo parámetro.

¿Qué métodos modernos evitan mutaciones?
toSorted, toReversed, toSpliced y with ofrecen alternativas inmutables a sort, reverse, splice y asignaciones por índice.

Conclusión

Ya no se trata solo de “conocer los métodos de arrays”, sino de saber cuándo usarlos. Si aplicas el patrón filtrar → transformar → reducir, si eliges inmutables por defecto y mutas con intención, y si dominas las variantes modernas (toSorted, toReversed, toSpliced, with, findLast, at, flatMap), tu código será más claro, robusto y mantenible. Esta guía reúne la API esencial de Array en JavaScript con ejemplos prácticos y patrones que realmente aparecen en proyectos.


JavaScript

Jairo

Comentarios (0)

No hay comentarios aún. ¡Sé el primero en comentar!

Envíame un comentario

🍪 Utilizamos cookies para mejorar tu experiencia de navegación, analizar el tráfico del sitio y personalizar el contenido. Al continuar navegando, aceptas nuestro uso de cookies. Más información