Los arrays (también llamados arreglos o matrices) cuentan con muchos métodos. Para hacer las cosas más sencillas, en este capítulo los separamos en grupos.
Agregar/remover ítems
Ya conocemos algunos métodos que agregan o extraen elementos del inicio o final de un array:
arr.push(...items)– agrega ítems al final,arr.pop()– extrae un ítem del final,arr.shift()– extrae un ítem del inicio,arr.unshift(...items)– agrega ítems al principio.
Veamos algunos métodos más.
splice
¿Cómo podemos borrar un elemento de un array?
Los arrays son objetos, por lo que podemos intentar con delete:
let arr = ["voy", "a", "casa"];
delete arr[1]; // remueve "a"
alert( arr[1] ); // undefined
// ahora arr = ["voy", , "casa"];
alert( arr.length ); // 3
El elemento fue borrado, pero el array todavía tiene 3 elementos; podemos ver que arr.length == 3.
Es natural, porque delete obj.key borra el valor de key, pero es todo lo que hace. Esto está bien en los objetos, pero en general lo que buscamos en los arrays es que el resto de los elementos se desplace y se ocupe el lugar libre. Lo que esperamos es un array más corto.
Por lo tanto, necesitamos utilizar métodos especiales.
El método arr.splice funciona como una navaja suiza para arrays. Puede hacer todo: insertar, remover y remplazar elementos.
La sintaxis es:
arr.splice(start[, deleteCount, elem1, ..., elemN])
Esto modifica arr comenzando en el índice start: remueve la cantidad deleteCount de elementos y luego inserta elem1, ..., elemN en su lugar. Lo que devuelve es un array de los elementos removidos.
Este método es más fácil de entender con ejemplos.
Empecemos removiendo elementos:
let arr = ["Yo", "estudio", "JavaScript"];
arr.splice(1, 1); // desde el índice 1, remover 1 elemento
alert( arr ); // ["Yo", "JavaScript"]
¿Fácil, no? Empezando desde el índice 1 removió 1 elemento.
En el próximo ejemplo, removemos 3 elementos y los reemplazamos con otros 2:
let arr = ["Yo", "estudio", "JavaScript", "ahora", "mismo"];
// remueve los primeros 3 elementos y los reemplaza con otros
arr.splice(0, 3, "a", "bailar");
alert( arr ) // ahora ["a", "bailar", "ahora", "mismo"]
Aquí podemos ver que splice devuelve un array con los elementos removidos:
let arr = ["Yo", "estudio", "JavaScript", "ahora", "mismo"];
// remueve los 2 primeros elementos
let removed = arr.splice(0, 2);
alert( removed ); // "Yo", "estudio" <-- array de los elementos removidos
El método splice también es capaz de insertar elementos sin remover ningún otro. Para eso necesitamos establecer deleteCount en 0:
let arr = ["Yo", "estudio", "JavaScript"];
// desde el index 2
// remover 0
// después insertar "el", "complejo" y "language"
arr.splice(2, 0,"el", "complejo", "language");
alert( arr ); // "Yo", "estudio","el", "complejo", "language", "JavaScript"
En este y en otros métodos de arrays, los índices negativos están permitidos. Estos índices indican la posición comenzando desde el final del array, de la siguiente manera:
let arr = [1, 2, 5];
// desde el index -1 (un lugar desde el final)
// remover 0 elementos,
// después insertar 3 y 4
arr.splice(-1, 0, 3, 4);
alert( arr ); // 1,2,3,4,5
slice
El método arr.slice es mucho más simple que su similar arr.splice.
La sintaxis es:
arr.slice([principio], [final])
Devuelve un nuevo array copiando en el mismo todos los elementos desde principio hasta final (sin incluir final). principio y final pueden ser negativos, en cuyo caso se asume la posición desde el final del array.
Es similar al método para strings str.slice, pero en lugar de substrings, genera subarrays.
Por ejemplo:
let arr = ["t", "e", "s", "t"];
alert( arr.slice(1, 3) ); // e,s (copia desde 1 hasta 3)
alert( arr.slice(-2) ); // s,t (copia desde -2 hasta el final)
También podemos invocarlo sin argumentos: arr.slice() crea una copia de arr. Se utiliza a menudo para obtener una copia que se puede transformar sin afectar el array original.
concat
El método arr.concat crea un nuevo array que incluye los valores de otros arrays y elementos adicionales.
La sintaxis es:
arr.concat(arg1, arg2...)
Este acepta cualquier número de argumentos, tanto arrays como valores.
El resultado es un nuevo array conteniendo los elementos de arr, después arg1, arg2 etc.
Si un argumento argN es un array, entonces todos sus elementos son copiados. De otro modo el argumento en sí es copiado.
Por ejemplo:
let arr = [1, 2];
// crea un array a partir de: arr y [3,4]
alert( arr.concat([3, 4]) ); // 1,2,3,4
// crea un array a partir de: arr y [3,4] y [5,6]
alert( arr.concat([3, 4], [5, 6]) ); // 1,2,3,4,5,6
// crea un array a partir de: arr y [3,4], luego agrega los valores 5 y 6
alert( arr.concat([3, 4], 5, 6) ); // 1,2,3,4,5,6
Normalmente, solo copia elementos desde arrays. Otros objetos, incluso si parecen arrays, son agregados como un todo:
let arr = [1, 2];
let arrayLike = {
0: "something",
length: 1
};
alert( arr.concat(arrayLike) ); // 1,2,[object Object]
…Pero si un objeto similar a un array tiene la propiedad especial Symbol.isConcatSpreadable, entonces concat lo trata como un array y en lugar de añadirlo como un todo, solo añade sus elementos.
let arr = [1, 2];
let arrayLike = {
0: "something",
1: "else",
[Symbol.isConcatSpreadable]: true,
length: 2
};
alert( arr.concat(arrayLike) ); // 1,2,something,else
Iteración: forEach
El método arr.forEach permite ejecutar una función a cada elemento del array.
La sintaxis:
arr.forEach(function(item, index, array) {
// ... hacer algo con un elemento
});
Por ejemplo, el siguiente código muestra cada elemento del array:
// para cada elemento ejecuta alert
["Bilbo", "Gandalf", "Nazgul"].forEach(alert);
Y este caso más detallado da la posición del elemento en el array:
["Bilbo", "Gandalf", "Nazgul"].forEach((item, index, array) => {
alert(`${item} is at index ${index} in ${array}`);
});
El resultado de la función (si lo hay) se descarta y se ignora.
Buscar dentro de un array
Ahora vamos a ver métodos que buscan elementos dentro de un array.
indexOf/lastIndexOf e includes
Los métodos arr.indexOf y arr.includes tienen una sintaxis similar y hacen básicamente lo mismo que sus contrapartes de strings, pero operan sobre elementos en lugar de caracteres:
arr.indexOf(item, from)– buscaitemcomenzando desde el indexfrom, y devuelve el index donde fue encontrado, de otro modo devuelve-1.arr.includes(item, from)– buscaitemcomenzando desde el índicefrom, devuelvetrueen caso de ser encontrado.
Usualmente estos métodos se usan con un solo argumento: el item a buscar. De manera predeterminada, la búsqueda es desde el principio.
Por ejemplo:
let arr = [1, 0, false];
alert( arr.indexOf(0) ); // 1
alert( arr.indexOf(false) ); // 2
alert( arr.indexOf(null) ); // -1
alert( arr.includes(1) ); // true
Tener en cuenta que el método usa la comparación estricta (===). Por lo tanto, si buscamos false, encontrará exactamente false y no cero.
Si queremos comprobar si un elemento existe en el array, pero no necesitamos saber su ubicación exacta, es preferible usar arr.includes
El método arr.lastIndexOf es lo mismo que indexOf, pero busca de derecha a izquierda.
let fruits = ['Apple', 'Orange', 'Apple']
alert( fruits.indexOf('Apple') ); // 0 (primera "Apple")
alert( fruits.lastIndexOf('Apple') ); // 2 (última "Apple")
includes maneja NaN correctamenteUna característica menor pero notable de includes es que, a diferencia de indexOf, maneja correctamente NaN:
const arr = [NaN];
alert( arr.indexOf(NaN) ); // -1 (debería ser 0, pero la igualdad === no funciona para NaN)
alert( arr.includes(NaN) );// true (correcto)
Esto es porque includes fue agregado a JavaScript mucho después, su algoritmo interno de comparación está actualizado.
find y findIndex/findLastIndex
Imaginemos que tenemos un array de objetos. ¿Cómo podríamos encontrar un objeto con una condición específica?
Para este tipo de casos es útil el método arr.find(fn)
La sintaxis es:
let result = arr.find(function(item, index, array) {
// si true es devuelto aquí, find devuelve el ítem y la iteración se detiene
// para el caso en que sea false, devuelve undefined
});
La función es llamada para cada elemento del array, uno después del otro:
itemes el elemento.indexes su índice.arrayes el array mismo.
Si devuelve true, la búsqueda se detiene y el item es devuelto. Si no encuentra nada, entonces devuelve undefined.
Por ejemplo, si tenemos un array de usuarios, cada uno con los campos id y name. Encontremos el elemento con id == 1:
let users = [
{id: 1, name: "Celina"},
{id: 2, name: "David"},
{id: 3, name: "Federico"}
];
let user = users.find(item => item.id == 1);
alert(user.name); // Celina
En la vida real, los arrays de objetos son bastante comunes, por lo que el método find resulta muy útil.
Ten en cuenta que en el ejemplo anterior le pasamos a find la función item => item.id == 1 con un argumento. Esto es lo más común, otros argumentos son raramente usados en esta función.
El método