En nuestro día a día tenemos que manipular frecuentemente objetos, Strings, Arrays, etc… En esta entrada vamos a echar un vistazo a algunas funciones para Arrays en Javascript y vamos a ver cómo nos pueden ayudar a dejar nuestro código más limpio y un poco más “entendible” para nuestros compañeros.

Como ya conoceréis, para casi todos los casos en los que tengáis que recorrer un Array, tenemos varias alternativas disponibles. Por ejemplo, si queremos buscar un elemento dentro de un Array podemos usar un bucle while o un for:

Dejando de lado cuestiones de rendimiento, que en la mayoría de casos no son significativas, la principal diferencia está en la legibilidad del código.
Los dos recorren un array hasta que encuentran una persona con 28 años de edad y después salen del bucle. Si no se nos ocurre ningún motivo para utilizar uno u otro, tenemos que ponernos en el lugar de la persona que vaya a leer el programa en el futuro.

Cuando encontramos un bucle while sabemos que va a recorrer el Array hasta que se cumpla una o varias condiciones, mientras que si encontramos un for, lo normal es que recorra todos los elementos que haya desde el inicio hasta el final (en este caso el inicio es 0 y el fin es la logitud del array, pero no tiene por qué ser así). Con lo que nuestro compañero va a entender mejor nuestra intención de buscar un elemento concreto si utilizamos un bucle while.

Cuanto más simple mejor

Los problemas pueden ser simples o complejos, pero nuestro código tiene que ser siempre lo más simple posible para no convertirse en parte del problema en el futuro.
Podríamos utilizar siempre el mismo tipo de bucle y nuestro código funcionaría igual, pero a medida que el programa evolucione y se complique, aparecerán nuevas funciones y bucles enrevesados y necesitamos mantener el código lo más legible y ordenado que podamos.
Pensad que aproximadamente el 90% del tiempo que se dedique a nuestro proyecto será para mantenerlo, así que podemos mantenerlo simple (“keep it simple, stupid” o KISS) o esperar a que nuestros compañeros empiecen a maldecir cuando revisen nuestro código.

 

Vamos a ver algunas de estas funciones :

forEach

La primera de estas funciones la utilizaremos cuando queramos hacer algo con cada elemento del array.
Es útil cuando queremos recorrer todos los elementos y hacer cualquier operación con cada uno de ellos por separado. Por ejemplo, queremos mostrar todos los elementos por la consola:

find

Queremos buscar un elemento y recogerlo en una variable.
Si quisieramos obtener un array con todos los elementos que cumplan esta condición, deberíamos utilizar filter.
Un ejemplo con find, queremos buscar la primera persona que tenga 30 años o más:

filter

Queremos un array filtrando elementos de otro array.
Por ejemplo, queremos buscar todas las personas que tengan 30 años o más:

Cuidado con los objetos Cuando un array está compuesto por objetos, si la función nos devuelve un elemento, este se pasa como referencia. En este ejemplo, si modificásemos el nombre de un elemento, este también cambiaría en el array original. Es un pequeño detalle que hay que tener en cuenta, porque os puede ahorrar más de un bug, o dos

some

Queremos comprobar que al menos un elemento cumple la condición. Devuelve true o false dependiendo de si ha encontrado el elemento o no.
Comprobamos si hay alguna persona mayor de 40 años :

Mismo ejemplo para comprobar si hay al menos una persona menor de 29 años:

every

Queremos comprobar que todos los elementos cumplen con las condiciones que queramos. Si encuentra un elemento que NO cumple con la condición que queremos, sale del bucle. Devuelve true si cumplen la condición y false en caso contrario.
Comprobamos si todas las personas son mayores de 30 años :

Comprobamos que todos son menores de 40:

map

Queremos crear un nuevo array aplicando una función que transforme todos los elemento del array original y manteniendo el original intacto.
Imaginad que queremos quitar la palabra ‘nombre’ en la propiedad nombre de cada persona :

Si map es un array de objetos y la función hace return de ese mismo objeto, estaréis creando un nuevo array con referencias a los objetos del array original y cualquier cambio en uno de estos objetos se verá en los dos arrays

reduce

Esta función puede resultar un poco más difícil de entender, pero es realmente útil.
Con ella, vamos a acumular el array en un solo elemento. Esta es la estructura

En la funcionCallback es donde metemos la lógica para acumular los valores y valorInicial es el valor inicial del total.
Por ejemplo, supongamos que tenemos un array de números y queremos acumularlos en un solo valor (una suma normal, con valor inicial 0):

En cada vuelta la función callback de reduce recibe 4 parámetros Total es el valor acumulado hasta ahora, numero es el elemento del array que estamos tratando en esta vuelta, indice es la posición de ese elemento en el array y por último el array original. Los dos primeros son imprescindibles y el resto opcionales.

En este ejemplo, en la primera vuelta:
total: 0, numero: 299

Segunda vuelta:
total: 299, numero: 100

Última vuelta:
total: 399, numero: 350

Y la última vuelta devolverá 399+350 que es el resultado final 749

Si no ponemos valor inicial, la primera vuelta cogerá el primer elemento del array como total:

Primera vuelta sin valor inicial:
total: 299, numero: 100

Última vuelta:
total: 399, numero: 350

En este caso ahorramos una vuelta, pero en los casos en los que queramos acumular el resultado en un nuevo array, el valor inicial es obligatorio.

También podríamos calcular la media de estos números devolviendo en la última vuelta el valor total dividido entre la longitud del array:

También podemos crear un nuevo array modificando el original y filtrando a la vez. Como si aplicásemos a la vez las funciones map y filter. Ejemplo, queremos hacer un descuento del 30% en los productos que tengan 100 unidades o menos :

Nos será útil si tenemos que filtrar y modificar a la vez, ya que hacemos las dos operaciones recorriendo una sola vez toda la colección y lo agradeceremos cuando la colección ser muy grande.
Si tuviésemos que hacer solo una de las operaciones es mejor utilizar filter o map por separado, recordad que queremos que se entiendan nuestras intenciones.

Evidentemente, hay otras funciones para Arrays en Javascript, pero no tampoco podemos abarcar todas de una tacada. Si empezamos a utilizar estas poco a poco, al final las utilizaremos de forma automática y podremos enfocarnos en otros puntos de mejora.

Espero que os sea útil

 

Sobre El Autor

Economista reconvertido a programador. Hoy en día trabajo como Desarrollador de aplicaciones web y móvil con Node.js, Angular.js (MEAN Stack) e Ionic framework. También intento mantenerme al día de lo que se mueve en este mundillo y mantengo este pequeño blog como documentación personal. Si echas algo de menos en el blog no dudes en comentar, y si te ha resultado de utilidad algún artículo, te agradezco que lo agradezcas ;-). ¡Un saludo!

Artículos Relacionados

Hacer Comentario

Su dirección de correo electrónico no será publicada.