Funciones flecha (arrow functions) en JavaScript explicadas claramente
Jairo
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í.
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)
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.
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.
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.
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]
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.
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]
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]
Aquí es donde un desarrollador pasa de “sé la API” a “sé aplicar la API”.
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.
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.
const ordenados = [...data].sort( (a,b) => a.prioridad - b.prioridad || a.nombre.localeCompare(b.nombre) );
Alternativa moderna: const ordenados = data.toSorted((a,b)=>...);
const unico = [...new Set(matriz.flat())];
Uso típico: filtros únicos para UI.
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.
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.
const cursos = [
{alumnos:['Ana','Luis']},
{alumnos:['Mara','Tom']}
];
const todos = cursos.flatMap(c => c.alumnos); // ['Ana','Luis','Mara','Tom']
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.
¿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.
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.
No hay comentarios aún. ¡Sé el primero en comentar!
🍪 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