Métodos de arrays

Tienes una lista de precios y quieres una segunda lista con impuestos agregados a cada uno. Podrías escribir un bucle for que recorra el array, haga la suma, e inserte cada resultado en un nuevo array. Eso funciona, pero es mucho trabajo para una idea pequeña: toma cada elemento y cámbialo. Los métodos de arrays son las herramientas integradas para exactamente este tipo de trabajo. Te permiten decir qué quieres que se haga con una lista sin explicar el bucle que lo hace, y este capítulo cubre los que usarás a diario. Se construyen directamente sobre arrays y funciones, así que mantén ambos a mano.
map: cambia cada elemento
map es un método: una función que pertenece a un array y realiza una tarea en él. map crea un nuevo array ejecutando cada elemento a través de una pequeña función que le das, y recopila los resultados. Le pasas esa función, e itera cada elemento uno a la vez.
Digamos que tienes algunos precios y quieres que cada uno se duplique:
const precios = [2, 4, 6];
const duplicados = precios.map((precio) => precio * 2);
console.log(duplicados); // [4, 8, 12]La parte (precio) => precio * 2 es una función flecha: una función corta que toma un elemento (precio) y devuelve en qué debe convertirse (precio * 2). map la llama una vez por elemento e inserta cada respuesta en el nuevo array, en el mismo orden.
map toma una lista y te da una nueva de la misma longitud, con cada elemento pasado por tu pequeña función. La función flecha dice en qué se convierte cada elemento, y map lo hace en todos ellos en orden. Úsalo cada vez que te encuentres escribiendo un bucle solo para construir una segunda lista. filter: mantén los elementos que pasan
Donde map cambia cada elemento, filter mantiene solo algunos de ellos. Le das una función que responde sí o no para cada elemento, y filter construye un nuevo array solo de los elementos que obtuvieron un sí.
const calificaciones = [40, 75, 90, 55, 88];
const aprobadas = calificaciones.filter((calificacion) => calificacion >= 60);
console.log(aprobadas); // [75, 90, 88]La función (calificacion) => calificacion >= 60 devuelve true o false para cada calificación. filter mantiene las que son true y descarta el resto. El nuevo array puede ser más corto que el original, y nunca cambia el orden.
filter mantiene los elementos que pasan una prueba y descarta el resto, así que el nuevo array es a menudo más corto. Tu función responde sí o no para cada elemento, y solo los síes pasan. Nunca reordena nada, así que lo que sobrevive permanece en el orden en que comenzó. reduce: colapsalo a un valor
map y filter ambos te devuelven un array. reduce es el que colapsa un array a un solo valor: un total, un máximo, una cadena unida. Desconcierta a más gente que los otros, así que vale la pena ir lento.
reduce recorre el array mientras lleva un resultado en ejecución junto con él. En cada elemento pregunta: dado el resultado hasta ahora, y este elemento, ¿cuál es el nuevo resultado?
const precios = [10, 20, 30];
const total = precios.reduce((suma, precio) => suma + precio, 0);
console.log(total); // 60La función obtiene dos cosas: suma, el total en ejecución hasta ahora, y precio, el elemento actual. Devuelve suma + precio, que se convierte en el nuevo total en ejecución para el siguiente elemento. El 0 al final es donde comienza el total. Así que va 0 + 10, luego 10 + 20, luego 30 + 30, llegando a 60.
reduce lleva un resultado en ejecución a través de la lista y lo actualiza en cada elemento. El callback obtiene el resultado hasta ahora más el elemento actual, y devuelve el nuevo resultado. El último argumento es donde comienzas, usualmente 0 para un total, y este me hizo clic en el momento en que lo leí en voz alta paso a paso. find, some, y every
Estos tres son parientes cercanos de filter: ejecutan una prueba sobre el array, pero en lugar de un nuevo array responden una pregunta más estrecha.
find te da el primer elemento que pasa la prueba, no una lista de todos ellos. some y every responden preguntas verdadero-o-falso sobre todo el array.
const calificaciones = [40, 75, 90, 55];
const primerAprobado = calificaciones.find((calificacion) => calificacion >= 60);
console.log(primerAprobado); // 75
const algunoAprobado = calificaciones.some((calificacion) => calificacion >= 60);
console.log(algunoAprobado); // true
const todosAprobados = calificaciones.every((calificacion) => calificacion >= 60);
console.log(todosAprobados); // falsefind devuelve el primer elemento coincidente (75). some pregunta "¿pasó algún elemento?" y devuelve true porque al menos uno lo hizo. every pregunta "¿pasaron todos?" y devuelve false porque 40 y 55 no lo hicieron.
find te da el primer elemento que pasa, no una lista completa. some pregunta "¿alguno pasó?" y every pregunta "¿todos pasaron?", y ambos responden con true o false. Usa estos cuando quieras un elemento o una respuesta de sí o no, no un array filtrado. Encadenamiento y manteniendo legibilidad
Los métodos anteriores comparten un diseño que se compensa una vez que los combinas: cada uno devuelve un nuevo valor y deja el array original intacto.
map, filter, y el resto nunca cambian el array con el que comenzaste. Te dan un nuevo array (o un valor) y dejan el original solo.
const precios = [10, 20, 30];
const duplicados = precios.map((precio) => precio * 2);
console.log(duplicados); // [20, 40, 60]
console.log(precios); // [10, 20, 30]Porque map y filter ambos devuelven un array, puedes alinearlos: primero filtra, luego mapea los sobrevivientes.
const precios = [10, 20, 30, 40];
const grandesDuplicados = precios.filter((precio) => precio >= 20).map((precio) => precio * 2);
console.log(grandesDuplicados); // [40, 60, 80]filter y map ambos devuelven arrays, puedes encadenarlos: filtra primero, luego mapea lo que queda. Lee la cadena de arriba a abajo, un paso a la vez. Por dónde seguir
map, filter, y reduce cubren la mayoría de lo que harás con una lista: transformarla, reducirla, o colapsarla. find, some, y every responden las preguntas más estrechas. Una vez que estos se sienten naturales, la mayoría de tus bucles for sobre un array se convierten en una línea o dos que dice lo que quisiste decir.
El siguiente paso natural es objetos, donde los arrays comienzan a mantener elementos más ricos que simples números y cadenas, y estos mismos métodos siguen funcionando en ellos. Si cualquiera de la sintaxis callback aquí se sintió inestable, una pasada por funciones hace que el resto haga clic.

