Clase 16
Clase 16
Clase 16
Un array es una colección o agrupación de elementos en una misma variable, cada uno de
ellos ubicado por la posición que ocupa en el array. En Javascript, se pueden definir de
varias formas:
Constructor Descripción
Por ejemplo, podríamos tener un array que en su primera posición tenemos el 'a', en la
segunda el 'b' y en la tercera el 'c'. En Javascript, esto se crearía de esta forma:
// Forma tradicional
const array = new Array("a", "b", "c");
OJO: Al crear un array con new Array(num), si solo indicamos un parámetro y num es un
número, Javascript creará un array de num elementos sin definir. Es decir, a = new
Array(3) sería equivalente a a = [undefined, undefined, undefined]. Esto no ocurre con su
equivalente, a = [3], donde estamos creando un array con un único elemento: 3.
Acceso a elementos
Al igual que las Strings , saber el número elementos que tiene un array es muy sencillo.
Sólo hay que acceder a la propiedad .length, que nos devolverá el número de elementos
existentes en un array:
Método Descripción
Por otro lado, si lo que queremos es acceder a un elemento específico del array, no hay
más que utilizar el operador [], al igual que hacemos con las Strings para acceder a un
carácter concreto. En este caso, accedemos a la posición del elemento que queremos
recuperar sobre el array:
const array = ["a", "b", "c"];
array[0]; // 'a'
array[2]; // 'c'
array[5]; // undefined
Recuerda que las posiciones empiezan a contar desde 0 y que si intentamos acceder a una
posición que no existe (mayor del tamaño del array), nos devolverá un undefined.
Existen varias formas de añadir elementos a un array existente. Veamos los métodos que
podemos usar para ello:
Método Descripción
.push(obj1, obj2...) Añade uno o varios elementos al final del array. Devuelve
tamaño del array.
En los arrays, Javascript proporciona métodos tanto para insertar o eliminar elementos por
el final del array: push() y pop(), como para insertar o eliminar elementos por el principio
del array: unshift() y shift(). Salvo por esto, funcionan exactamente igual.
El método de inserción, push() o unshift() inserta los elementos pasados por parámetro en
el array y devuelve el tamaño actual que tiene el array después de la inserción. Por otro
lado, los métodos de extracción, pop() o shift(), extraen y devuelven el elemento.
Además, al igual que en las Strings tenemos el método concat(), que nos permite
concatenar los elementos pasados por parámetro en un array. Se podría pensar que los
métodos .push() y concat() funcionan de la misma forma, pero no es exactamente así.
Veamos un ejemplo:
Creación de arrays
Existen métodos para crear pequeños arrays derivados de otras variables u objetos. Es el
caso de los métodos slice() y splice(). Luego, también hablaremos del método join() y el
método estático Array.from():
Método Descripción
.slice(ini, end) Devuelve los elementos desde posición ini hasta end
(excluído).
.splice(ini, num, o1, o2...) Idem. Además inserta o1, o2... en la posición ini.
Por otro lado, ten en cuenta que el array sobre el que realizamos el método slice() no sufre
ninguna modificación, sólo se devuelve por parámetro el array creado. Diferente es el caso
del método splice(), el cuál realiza algo parecido a slice() pero con una gran diferencia:
modifica el array original. En el método splice() el segundo parámetro num no es la
posición final del subarray, sino el tamaño del array final, es decir, el número de elementos
que se van a obtener desde la posición ini.
Por lo tanto, con el método splice(), devolvemos un array con los elementos desde la
posición ini hasta la posición ini+num. El array original es modificado, ya que se eliminan
los elementos desde la posición ini hasta la posición ini+num. Es posible también indicar
una serie de parámetros opcionales después de los mencionados, que permitirán además
de la extracción de elementos, insertar dichos elementos justo donde hicimos la
extracción.
A raíz de este último ejemplo, también podemos insertar elementos en una posición
concreta del array de estas dos formas alternativas: utilizando slice() y concat() o utilizando
splice() y una característica que veremos más adelante llamada desestructuración:
Además, también tenemos otro método con el que es posible crear un a partir de un . Se
trata del método split() que vimos en el tema de los . En este caso, el método join() es su
contrapartida. Con join() podemos crear un con todos los elementos del array, separándolo
por el texto que le pasemos por parámetro:
Ten en cuenta que, como se puede ver en el último ejemplo, split() siempre devolverá los
elementos como .
Método Descripción
Array.isArray(array); // true
array.includes(10); // true
array.includes(10, 2); // false
array.indexOf(25); // 4
array.lastIndexOf(10, 0); // -1
Por otro lado, tenemos indexOf() y lastIndexOf() dos funciones que se utilizan para
devolver la posición del elemento obj pasado por parámetro, empezando a buscar en la
posición from (o 0 si se omite). El primer método, devuelve la primera aparición, mientras
que el segundo método devuelve la última aparición.
Modificación de arrays
Es posible que tengamos un array específico al que queremos hacer ciertas modificaciones
donde slice() y splice() se quedan cortos (o resulta más cómodo utilizar los siguientes
métodos). Existen algunos métodos introducidos en ECMAScript 6 que nos permiten crear
una versión modificada de un array, mediante métodos como copyWithin() o fill():
Método Descripción
.copyWithin(pos, ini, end) Devuelve , copiando en pos los ítems desde ini a
end.
.fill(obj, ini, end) Devuelve un relleno de obj desde ini hasta end.
El primero de ellos, copyWithin(pos, ini, end) nos permite crear una copia del array que
alteraremos de la siguiente forma: en la posición pos copiaremos los elementos del propio
array que aparecen desde la posición ini hasta la posición end. Es decir, desde la posición
0 hasta pos será exactamente igual, y de ahí en adelante, será una copia de los valores de
la posición ini a la posición end. Veamos algunos ejemplos:
const array = ["a", "b", "c", "d", "e", "f"];
Por otro lado, el método fill(obj, ini, end) es mucho más sencillo. Se encarga de devolver
una versión del array, rellenando con el elemento obj desde la posición ini hasta la posición
end.
Ordenaciones
En JavaScript, es muy habitual que tengamos arrays y queramos ordenar su contenido por
diferentes criterios. En este apartado, vamos a ver los métodos reverse() y sort(), útiles
para ordenar un array:
Método Descripción
.sort(func) Ordena los elementos del array bajo un criterio de ordenación func.
En primer lugar, el método reverse() cambia los elementos del array en orden inverso, es
decir, si tenemos [5, 4, 3] lo modifica de modo que ahora tenemos [3, 4, 5]. Por otro lado, el
método sort() realiza una ordenación (por orden alfabético) de los elementos del array:
const array = ["Alberto", "Ana", "Mauricio", "Bernardo", "Zoe"];
Un detalle muy importante es que estos dos métodos modifican el array original, además
de devolver el array modificado. Si no quieres que el array original cambie, asegúrate de
crear primero una copia del array, para así realizar la ordenación sobre esa copia y no sobre
el original.
Sin embargo, la ordenación anterior se realizó sobre Strings y todo fue bien. Veamos que
ocurre si intentamos ordenar un array de números:
Esto ocurre porque, al igual que en el ejemplo anterior, el tipo de ordenación que realiza
sort() por defecto es una ordenación alfabética, mientras que en esta ocasión buscamos
una ordenación natural, que es la que se suele utilizar con números. Esto se puede hacer
en JavaScript, pero requiere pasarle por parámetro al sort() lo que se llama una función de
comparación.
Función de comparación
Como hemos visto, la ordenación que realiza sort() por defecto es siempre una ordenación
alfabética. Sin embargo, podemos pasarle por parámetro lo que se conoce con los nombres
de función de ordenación o función de comparación. Dicha función, lo que hace es
establecer otro criterio de ordenación, en lugar del que tiene por defecto:
Básicamente, son métodos que tiene cualquier variable que sea de tipo Array y que permite
realizar una operación con todos los elementos de dicho array para conseguir un objetivo
concreto, dependiendo del método. En general, a dichos métodos se les pasa por
parámetro una función callback y unos parámetros opcionales.
Método Descripción
.filter(cb, arg) Construye un array con los elementos que cumplen el filtro de
cb.
.reduce(cb, arg) Ejecuta cb con cada elemento (de izq a der), acumulando el
resultado.
A grandes rasgos, a cada uno de estos métodos se les pasa una función callback que se
ejecutará por cada uno de los elementos que contiene el array. Empecemos por forEach(),
que es quizás el más sencillo de todos.
Como se puede ver, el método forEach() no devuelve nada y espera que se le pase por
parámetro una que se ejecutará por cada elemento del array. Esa función, puede ser
pasada en cualquiera de los formatos que hemos visto: como función tradicional o como
función flecha:
Sin embargo, este ejemplo no tiene demasiada utilidad. A la función callback se le pueden
pasar varios parámetros opcionales:
Veamos un ejemplo:
El método every() permite comprobar si todos y cada uno de los elementos de un array
cumplen la condición que se especifique en la callback:
Observa que en este ejemplo, el método some() devuelve true porque existe al menos un
elemento del array con una longitud de 2 carácteres.
map (Transformaciones)
El método map() es un método muy potente y útil para trabajar con arrays, puesto que su
objetivo es devolver un nuevo array donde cada uno de sus elementos será lo que devuelva
la función callback por cada uno de los elementos del array original:
Observa que el array devuelto por map() es nuevoArr, y cada uno de los elementos que lo
componente, es el número devuelto por el callback (e.length), que no es otra cosa sino el
tamaño de cada .
Este método nos permite hacer multitud de operaciones, ya que donde devolvemos
e.length podriamos devolver el propio modificado o cualquier otra cosa.
filter (Filtrado)
El método filter() nos permite filtrar los elementos de un array y devolver un nuevo array
con sólo los elementos que queramos. Para ello, utilizaremos la función callback para
establecer una condición que devuelve true sólo en los elementos que nos interesen:
const arr = ["Ana", "Pablo", "Pedro", "Pancracio", "Heriberto"];
const nuevoArr = arr.filter((e) => e[0] == "P");
En este ejemplo, filtramos sólo los elementos en los que su primera letra sea P. Por lo tanto,
la variable nuevoArr será un array con sólo esos elementos.
Ten en cuenta que si ningún elemento cumple la condición, filter() devuelve un vacío.
find (Búsqueda)
En ECMAScript 6 se introducen dos nuevos métodos dentro de las Array functions: find()
y findIndex(). Ambos se utilizan para buscar elementos de un array mediante una
condición, la diferencia es que el primero devuelve el elemento mientras que el segundo
devuelve su posición en el array original. Veamos como funcionan:
La condición que hemos utilizado en este ejemplo es buscar el elemento que tiene 5
carácteres de longitud. Al buscarlo en el array original, el primero que encontramos es
Pablo, puesto que find() devolverá 'Pablo' y findIndex() devolverá 1, que es la segunda
posición del array donde se encuentra.
reduce (Acumuladores)
Por último, nos encontramos con una pareja de métodos denominados reduce() y
reduceRight(). Ambos métodos se encargan de recorrer todos los elementos del array, e ir
acumulando sus valores (o alguna operación diferente) y sumarlo todo, para devolver su
resultado final.
En este par de métodos, encontraremos una primera diferencia en su función callback,
puesto que en lugar de tener los clásicos parámetros opcionales (e, i, a) que hemos
utilizado hasta ahora, tiene (p, e, i, a), donde vemos que aparece un primer parámetro extra
inicial: p.
En la primera iteración, p contiene el valor del primer elemento del array y e del segundo.
En siguientes iteraciones, p es el acumulador que contiene lo que devolvió el callback en la
iteración anterior, mientras que e es el siguiente elemento del array, y así sucesivamente.
Veamos un ejemplo para entenderlo:
¿Qué es un string?
new String(s) Crea un objeto de texto a partir del texto s pasado por parámetro.
Los strings son tipos de datos primitivos, y como tal, es más sencillo utilizar los literales que
la notación con new. Para englobar los textos, se pueden utilizar comillas simples ',
comillas dobles " o backticks ` (ver más adelante).
// Literales
const texto1 = "¡Hola a todos!";
const texto2 = "Otro mensaje de texto";
// Objeto
const texto1 = new String("¡Hola a todos!");
const texto2 = new String("Otro mensaje de texto");
Al crear una variable con contenido de texto, o sea un , automaticamente, esa variable pasa
a tener a su disposición todas las propiedades y métodos disponibles para este tipo de dato,
por lo que podemos utilizarlos en nuestro código como iremos viendo a continuación.
Propiedad Descripción
En el caso de los strings, solo tenemos una propiedad, .length, que devuelve el tamaño de
la variable de texto en cuestión. Nótese en los siguientes ejemplos que se han utilizado
directamente, sin necesidad de guardarlos en una variable antes:
"Hola".length; // 4
"Adiós".length; // 5
"".length; // 0
"¡Yeah!".length; // 6
Pero las características más interesantes de los strings se encuentran en los métodos de
dicho tipo de dato. Ten en cuenta que, en las variables de texto, los métodos se ejecutan
sobre el propio texto del , devolviendo información modificada a partir de este. Vamos a dar
un repaso a los métodos que existen.
Métodos de posiciones
En primer lugar existen varios métodos que permiten darnos información sobre la posición
o ubicación que ocupa un determinado carácter o texto. Esta posición también suele
denominarse índice. Veamos detalladamente dichos métodos:
Método Descripción Oper.
No obstante, es preferible utilizar el operador [] para obtener el carácter que ocupa una
posición, ya que es más corto y rápido de utilizar y mucho más claro. La diferencia respecto
a charAt() es que el operador [] devuelve si en esa posición no existe ningún carácter.
"Manz".charAt(0); // 'M'
"Manz".charAt(1); // 'a'
"Manz".charAt(10); // ''
"Manz"[0]; // 'M'
"Manz"[1]; // 'a'
"Manz"[10]; // undefined
El método .concat(str1, str2...) permite concatenar (unir) los textos pasados por
parámetros al de la propia variable. Al igual que el método anterior, es preferible utilizar el
operador +, ya que es mucho más rápido y legible. Mucho cuidado con utilizar el operador
+, ya que depende de los tipos de datos con los que se usen puede producir un efecto
diferente. El operador + usado con realiza concatenaciones, mientras que usado con
realiza sumas.
Por último, nos queda el método indexOf(str, from), que es la función opuesta a charAt().
La función indexOf(str) buscará el subtexto str en nuestra variable y nos devolverá un con
la posición de la primera aparición de dicho subtexto. En caso de no encontrarlo, devolverá
-1. El parámetro from es opcional, y es la posición en la que empezará a buscar, que por
defecto (si no se suministra) es 0.
El método lastIndexOf(str, from) funciona exactamente igual que el anterior, sólo que
realiza la búsqueda de la última aparición en lugar de la primera aparición.
Por ejemplo, el método startsWith(str, from) devolverá true si la variable comienza por el
texto proporcionado en str. Si además se indica el parámetro opcional from, empezará en
la posición from del . De la misma forma, el método endsWith() comprueba cuando un
acaba en str, y el método includes() comprueba si el subtexto dado está incluído en el .
Algunos ejemplos:
.replace(str, newstr) Reemplaza la primera aparición del texto str por newstr.
.replaceAll(str, newstr) Reemplaza todas las apariciones del texto str por
newstr.
.substr(ini, len) Devuelve el subtexto desde la posición ini hasta ini+len.
El método repeat(n) devuelve como el texto repetido n veces. Por otro lado, los métodos
toLowerCase() y toUpperCase() devuelven el texto convertido todo a minúsculas o todo a
mayúsculas respectivamente:
"Na".repeat(5); // 'NaNaNaNaNa'
"MANZ".toLowerCase(); // 'manz'
"manz".toUpperCase(); // 'MANZ'
" Hola ".trim(); // 'Hola'
Reemplazar textos
Si lo que nos interesa es reemplazar todas las apariciones, tendremos que hacer uso de las
expresiones regulares. A grandes rasgos, en el tercer ejemplo anterior, en lugar de indicar
el string 'a' indicamos la expresión regular /a/g que buscará todas las apariciones de a de
forma global (todas las ocurrencias).
Desde ECMAScript {.es2021} es posible utilizar replaceAll() para reemplazar todas las
ocurrencias de un texto o de una expresión regular. Funciona exactamente igual que
replace(), sólo que reemplaza todas las ocurrencias en vez de solamente la primera.
Además, el método replace() nos permite indicar, como segundo parámetro una en lugar
de un , permitiendo utilizar dicha función para realizar un proceso más complejo al
reemplazar, en lugar de simplemente reemplazar por un . Sin embargo, para aprender a
utilizar esta funcionalidad, antes tendremos que aprender los callbacks, que veremos
también más adelante.
Extraer subtextos
Por otro lado, el método substring(ini, end) extrae el fragmento de texto desde la posición
ini hasta la posición end. De igual forma al anterior, si se omite el parámetro end, el
subtexto abarcará hasta el final del texto original.
Otro método muy útil es split(sep), un método que permite dividir un por el substring sep
como separador, devolviendo un array con cada una de las partes divididas. Es muy útil
para crear arrays, o dividir en diferentes secciones textos que tienen separadores
repetidos como podrían ser comas, puntos o pipes:
En el tema de los arrays veremos un método llamado join() que es justo el opuesto de
split(). Si split separa un string en varios y los mete en un array, join une varios elementos
de un array añadiéndole un separador y lo convierte en string.
Relleno de cadenas
Otra transformación interesante con los es la resultante de utilizar métodos como
padStart(len, str) o padEnd(len, str). Ambos métodos toman dos parámetros: len la
longitud deseada del resultante y str el carácter a utilizar como relleno.
Interpolación de variables
Hasta ahora, si queríamos concatenar el valor de algunas variables con textos predefinidos
por nosotros, teníamos que hacer algo parecido a esto:
A medida que añadimos más variables, el código se hace bastante menos claro y más
complejo de leer, especialmente si tenemos que añadir arrays, introducir comillas simples
que habría que escapar con \' o combinar comillas simples con dobles, etc...
Para evitarlo, se introducen las backticks (comillas hacia atrás), que nos permiten
interpolar el valor de las variables sin tener que cerrar, concatenar y abrir la cadena de
texto continuamente: