Operações com Arrays - JavaScript
A linguagem JavaScript oferece amplas possibilidades para trabalhar com arrays, que são realizadas através dos métodos do objeto Array:
: combina elementos de dois arrays em um único array.concat()
: verifica se todos os elementos atendem a uma determinada condição.every()
: filtra elementos do array.filter()
: retorna o primeiro elemento do array que corresponde a uma determinada condição.find()
: retorna o último elemento que atende à condição.findLast()
: retorna o índice do primeiro elemento do array que corresponde a uma determinada condição.findIndex()
: retorna o índice do último elemento que atende à condição.findLastIndex()
: simplifica a estrutura de elementos aninhados do array.flat()
: aplica uma função específica a cada elemento do array.forEach()
: verifica se um valor está presente no array.includes()
: retorna o índice da primeira ocorrência de um elemento no array.indexOf()
: junta elementos do array em uma string.join()
: retorna o índice da última ocorrência de um elemento no array.lastIndexOf()
: transforma cada elemento do array em outro valor com base em uma função de transformação (projeção dos elementos).map()
: remove o último elemento do array.pop()
: adiciona um elemento ao final do array.push()
: combina elementos do array em um único valor.reduce()
: inverte a ordem dos elementos do array.reverse()
: remove o primeiro elemento do array.shift()
: extrai elementos específicos do array.slice()
: adiciona elementos em uma posição específica no array.splice()
: verifica se pelo menos um elemento atende a uma condição.some()
: ordena o array.sort()
: adiciona um novo elemento no início do array.unshift()
Adicionando Dados
push()
O método push()
const people = [];
people.push("Tom");
people.push("Sam");
people.push("Bob", "Mike");
console.log("elementos no people: ", people.length);
console.log(people); // ["Tom", "Sam", "Bob", "Mike"]
unshift()
O método unshift()
const people = ["Bob"];
people.unshift("Alice");
console.log(people); // ["Alice", "Bob"]
people.unshift("Tom", "Sam");
console.log(people); // ["Tom", "Sam", "Alice", "Bob"]
Adicionando Dados em um Índice Específico
splice()
O método splice
const people = ["Tom", "Sam", "Bob"];
people.splice(1, 0, "Alice"); // adiciona o elemento "Alice" no índice 1
console.log(people); // ["Tom", "Alice", "Sam", "Bob"]
Também é possível adicionar um conjunto de elementos a partir de um índice específico:
const people = ["Tom", "Sam", "Bob"];
people.splice(1, 0, "Alice", "Alex", "Kate"); // adiciona os elementos no índice 1
console.log(people); // ["Tom", "Alice", "Alex", "Kate", "Sam", "Bob"]
Removendo Dados
pop()
O método pop() remove o último elemento do array:
const people = ["Tom", "Sam", "Bob", "Mike"];
const lastPerson = people.pop(); // remove o último elemento do array
console.log(lastPerson); // Mike
console.log(people); // ["Tom", "Sam", "Bob"]
Como resultado, o método pop
shift()
O método shift()
const people = ["Tom", "Sam", "Bob", "Mike"];
const first = people.shift(); // remove o primeiro elemento do array
console.log(first); // Tom
console.log(people); // ["Sam", "Bob", "Mike"]
Removendo Elementos por Índice
splice()
O método splice
const people = ["Tom", "Sam", "Bill", "Alice", "Kate"];
const deleted = people.splice(3);
console.log(deleted); // ["Alice", "Kate"]
console.log(people); // ["Tom", "Sam", "Bill"]
O método splice
const people = ["Tom", "Sam", "Bill", "Alice", "Kate"];
const deleted = people.splice(-1);
console.log(deleted); // ["Kate"]
console.log(people); // ["Tom", "Sam", "Bill", "Alice"]
Uma versão adicional do método permite definir a quantidade de elementos a serem removidos. Por exemplo, para remover três elementos a partir do primeiro índice:
const people = ["Tom", "Sam", "Bill", "Alice", "Kate"];
const deleted = people.splice(1, 3);
console.log(deleted); // ["Sam", "Bill", "Alice"]
console.log(people); // ["Tom", "Kate"]
Substituindo Elementos
splice()
O método splice()
const people = ["Tom", "Sam", "Bob", "Alice", "Kate"];
const deleted = people.splice(1, 3, "Alex", "Mike");
console.log(deleted); // ["Sam", "Bob", "Alice"]
console.log(people); // ["Tom", "Alex", "Mike", "Kate"]
Aqui, removemos três elementos a partir do índice 1 (primeiro parâmetro de splice
Copiando Arrays
slice()
Copiar um array pode ser uma cópia superficial (shallow copy) ou uma cópia profunda (deep copy).
Para uma cópia superficial, basta atribuir o valor de uma variável que contém um array a outra variável:
const users = ["Tom", "Sam", "Bill"];
console.log(users); // ["Tom", "Sam", "Bill"]
const people = users; // cópia superficial
people[1] = "Mike"; // alterando o segundo elemento
console.log(users); // ["Tom", "Mike", "Bill"]
Neste caso, a variável people
users
people
users
Esse comportamento nem sempre é desejável. Por exemplo, queremos que, após a cópia, as variáveis apontem para arrays separados. Nesse caso, podemos usar a cópia profunda com o método slice()
const users = ["Tom", "Sam", "Bill"];
console.log(users); // ["Tom", "Sam", "Bill"]
const people = users.slice(); // cópia profunda
people[1] = "Mike"; // alterando o segundo elemento
console.log(users); // ["Tom", "Sam", "Bill"]
console.log(people); // ["Tom", "Mike", "Bill"]
Neste exemplo, após a cópia, as variáveis apontarão para arrays diferentes, permitindo alterações independentes.
Mas vale destacar que a mesma cópia pode ser feita usando o operador spread ...
const users = ["Tom", "Sam", "Bill"];
console.log(users); // ["Tom", "Sam", "Bill"]
const people = [...users];
people[1] = "Mike"; // alterando o segundo elemento
console.log(users); // ["Tom", "Sam", "Bill"]
console.log(people); // ["Tom", "Mike", "Bill"]
O método slice()
slice(indice_inicial, indice_final)
O primeiro parâmetro indica o índice inicial do elemento para a seleção de valores do array. O segundo parâmetro é o índice final, até o qual a cópia deve ser feita.
Se apenas o índice inicial for especificado e for positivo, a cópia será feita deste índice até o final do array:
const users = ["Tom", "Sam", "Bill", "Alice", "Kate"];
const people = users.slice(2); // do segundo índice até o final
console.log(people); // ["Bill", "Alice", "Kate"]
Se apenas o índice inicial for especificado, mas for negativo, o índice é contado a partir do final do array, e a cópia é feita do final até este índice:
const users = ["Tom", "Sam", "Bill", "Alice", "Kate"];
const people = users.slice(-2); // até o segundo índice a partir do final
console.log(people); // ["Alice", "Kate"]
O segundo parâmetro permite limitar a seleção dos elementos a serem copiados. Por exemplo, selecionando elementos do índice 1 ao 4, excluindo o índice 4:
const users = ["Tom", "Sam", "Bill", "Alice", "Kate"];
const people = users.slice(1, 4);
console.log(people); // ["Sam", "Bill", "Alice"]
Como a indexação de arrays começa em zero, o novo array conterá o segundo, terceiro e quarto elementos.
O segundo parâmetro também pode ser negativo. Nesse caso, o índice é contado a partir do final:
const users = ["Tom", "Sam", "Bill", "Alice", "Kate"];
const people = users.slice(2, -1); // do índice 2 até o índice 1 a partir do final
console.log(people); // ["Bill", "Alice"]
copyWithin()
O método copyWithin()
copyWithin(destino, inicio, fim)
Exemplo de uso:
const users = ["Tom", "Sam", "Bob", "Alice", "Kate"];
const people = users.copyWithin(1, 3, 5); // elementos do índice 3 ao 4 (dois elementos)
// são copiados para o índice 1
console.log(people); // ["Tom", "Alice", "Kate", "Alice", "Kate"]
Obtendo Elementos Fora do Intervalo
toSpliced()
Se quisermos obter elementos fora de um determinado intervalo sem alterar o array atual, podemos usar o método toSpliced()
const people = ["Tom", "Sam", "Bill", "Alice", "Kate"];
const range = people.toSpliced(1, 3);
console.log(range); // ["Tom", "Kate"]
console.log(people); // ["Tom", "Sam", "Bill", "Alice", "Kate"]
Concatenando Arrays
concat()
O método concat()
const men = ["Tom", "Sam", "Bob"];
const women = ["Alice", "Kate"];
const people = men.concat(women);
console.log(people); // ["Tom", "Sam", "Bob", "Alice", "Kate"]
Ordenando Arrays
sort()
O método sort()
const people = ["Tom", "Sam", "Bob"];
people.sort();
console.log(people); // ["Bob", "Sam", "Tom"]
Vale notar que, por padrão, o método sort()
const numbers = [200, 15, 5, 35];
numbers.sort();
console.log(numbers); // [15, 200, 35, 5]
Aqui, queremos ordenar um array de números, mas o resultado pode ser surpreendente: [15, 200, 35, 5]. Nesse caso, podemos ajustar o método, passando uma função de comparação. Definimos a lógica da função de comparação:
const numbers = [200, 15, 5, 35];
numbers.sort((a, b) => a - b);
console.log(numbers); // [5, 15, 35, 200]
A função de comparação recebe dois elementos adjacentes do array. Ela retorna um número negativo se o primeiro elemento deve ser colocado antes do segundo. Se o primeiro elemento deve ser colocado após o segundo, retorna um número positivo. Se os elementos são iguais, retorna 0.
sorted()
O JavaScript também fornece o método toSorted()
const numbers = [200, 15, 5, 35];
const sorted = numbers.toSorted();
console.log(sorted); // [15, 200, 35, 5]
Por padrão, o método toSorted()
const numbers = [200, 15, 5, 35];
const sorted = numbers.toSorted((a, b) => a - b);
console.log(sorted); // [5, 15, 35, 200]
Revertendo a Ordem dos Elementos
reverse()
O método reverse()
const people = ["Tom", "Sam", "Bob"];
people.reverse();
console.log(people); // ["Bob", "Sam", "Tom"]
toReversed()
O método toReversed()
const people = ["Tom", "Sam", "Bob"];
const reversed = people.toReversed();
console.log(people); // ["Tom", "Sam", "Bob"]
console.log(reversed); // ["Bob", "Sam", "Tom"]
Pesquisa do Índice de um Elemento
Os métodos indexOf()
lastIndexOf()
const people = ["Tom", "Sam", "Bob", "Tom", "Alice", "Sam"];
const firstIndex = people.indexOf("Tom");
const lastIndex = people.lastIndexOf("Tom");
const otherIndex = people.indexOf("Mike");
console.log(firstIndex); // 0
console.log(lastIndex); // 3
console.log(otherIndex); // -1
firstIndex
Se o elemento não for encontrado, o método indexOf()
lastIndexOf()
Verificação de Presença de um Elemento
includes()
O método includes()
true
false
const people = ["Tom", "Sam", "Bob", "Tom", "Alice", "Sam"];
console.log(people.includes("Tom")); // true - "Tom" está no array
console.log(people.includes("Kate")); // false - "Kate" não está no array
Como segundo parâmetro, o método includes()
const people = ["Tom", "Sam", "Bob", "Tom", "Alice", "Sam"];
console.log(people.includes("Bob", 2)); // true
console.log(people.includes("Bob", 4)); // false
Neste exemplo, ao procurar a partir do índice 2, encontramos a string "Bob", mas ao procurar a partir do índice 4, ela não está presente.
Se este parâmetro não for fornecido, a busca começa no índice 0 por padrão. Se for passado um valor negativo, a busca começa do final do array:
const people = ["Tom", "Sam", "Bob", "Tom", "Alice", "Sam"];
console.log(people.includes("Tom", -2)); // false - 2º índice a partir do final
console.log(people.includes("Tom", -3)); // true - 3º índice a partir do final
Verificação de Condições
every()
O método every()
const numbers = [1, -12, 8, -4, 25, 42];
const passed = numbers.every(n => n > 0);
console.log(passed); // false
O método every()
true
false
false
some()
O método some()
every()
true
false
const numbers = [1, -12, 8, -4, 25, 42];
const passed = numbers.some(n => n > 0);
console.log(passed); // true
filter()
O método filter()
some()
every()
filter(callbackFn)
filter(callbackFn, thisArg)
Como parâmetro, filter
callback(element, index, array)
A função callback recebe sequencialmente o elemento atual (element
index
array
true
false
Opcionalmente, um objeto pode ser passado como segundo parâmetro para o método filter()
this
Como resultado, o método filter()
const numbers = [1, -12, 8, -4, 25, 42];
const filteredNumbers = numbers.filter(n => n > 0);
console.log(filteredNumbers); // [1, 8, 25, 42]
Iteração de Elementos
forEach()
O método forEach()
forEach(callbackFn)
forEach(callbackFn, thisArg)
Como parâmetro, forEach
callback(element, index, array)
A função callback recebe sequencialmente o elemento atual (element
index
array
Opcionalmente, um objeto pode ser passado como segundo parâmetro para o método forEach()
this
Por exemplo, podemos usar o método forEach()
const numbers = [1, 2, 3, 4, 5, 6];
numbers.forEach(n =>
console.log("Quadrado do número", n, "é", n * n)
);
O método forEach()
Saída no console:
Quadrado do número 1 é 1 Quadrado do número 2 é 4 Quadrado do número 3 é 9 Quadrado do número 4 é 16 Quadrado do número 5 é 25 Quadrado do número 6 é 36
Transformação de Array
map()
O método map()
forEach()
map(callbackFn)
map(callbackFn, thisArg)
O primeiro parâmetro é uma função callback que recebe o elemento atual em iteração, seu índice e uma referência ao array. O segundo parâmetro é um valor para this
map()
Por exemplo, usamos o método map()
const numbers = [1, 2, 3, 4, 5, 6];
const squares = numbers.map(n => n * n);
console.log(squares); // [1, 4, 9, 16, 25, 36]
A função passada para o método map()
squares
Busca em Array
find()
O método find()
find
const numbers = [1, 2, 3, 5, 8, 13, 21, 34];
// Obtém o primeiro elemento que é maior que 10
let found = numbers.find(n => n > 10);
console.log(found); // 13
Neste caso, obtemos o primeiro elemento que é maior que 10. Se nenhum elemento atender à condição, undefined
findLast()
De forma semelhante, o método findLast()
const numbers = [1, 2, 3, 5, 8, 13, 21, 34];
let found = numbers.findLast(n => n < 10);
console.log(found); // 8
findIndex()
O método findIndex()
const numbers = [1, 2, 3, 5, 8, 13, 21, 34];
// Obtém o índice do primeiro elemento que é maior que 10
let foundIndex = numbers.findIndex(n => n > 10);
console.log(foundIndex); // 5
Se nenhum elemento for encontrado, retorna -1.
findLastIndex()
O método findLastIndex()
const numbers = [1, 2, 3, 5, 8, 13, 21, 34];
// Obtém o índice do último elemento que é menor que 10
let foundIndex = numbers.findLastIndex(n => n < 10);
console.log(foundIndex); // 4
Transformação de Array
flat()
O método flat()
const people = ["Tom", "Bob", ["Alice", "Kate", ["Sam", "Ann"]]];
const flattenPeople = people.flat();
console.log(flattenPeople); // ["Tom", "Bob", "Alice", "Kate", ["Sam", "Ann"]]
Isso significa que o método flat()
flat()
const people = ["Tom", "Bob", ["Alice", "Kate", ["Sam", "Ann"]]];
const flattenPeople = people.flat(2);
console.log(flattenPeople); // ["Tom", "Bob", "Alice", "Kate", "Sam", "Ann"]
Se o array contiver arrays aninhados de níveis muito mais profundos, ou se não soubermos os níveis de profundidade existentes no array, mas queremos que todos os elementos sejam transformados em um único array, podemos usar o valor Infinity
const people = ["Tom", "Bob", ["Alice", "Kate", ["Sam", "Ann"]]];
const flattenPeople = people.flat(Infinity);
console.log(flattenPeople); // ["Tom", "Bob", "Alice", "Kate", "Sam", "Ann"]
reduce()
O método reduce permite consolidar todos os valores de um array em um único valor, que é retornado pelo método. Ele recebe uma função com quatro parâmetros:
function (prev, current, curIndex, array) { .... }
Parâmetros:
prev: elemento anterior (no início - o primeiro elemento)
current: elemento atual (no início - o segundo elemento)
curIndex: índice do elemento atual
array: o array para o qual a função é chamada
Usamos o método reduce()
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((prev, current) => prev += current);
console.log(sum); // 15
Neste caso, a função (prev, current) => prev += current
Outra forma do método reduce
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((prev, current) => prev + current, 10);
console.log(sum); // 25
Neste caso, o valor inicial de prev
Se o método reduce
reduceRight()
const numbers = [1, 2, 3, 4, 5];
const reduced1 = numbers.reduce((prev, current) => prev += current.toString());
console.log(reduced1); // 12345
const reduced2 = numbers.reduceRight((prev, current) => prev += current.toString());
console.log(reduced2); // 54321
Combinação de Métodos
Quando necessário, podemos combinar várias operações em uma cadeia de métodos. Por exemplo, temos um array de usuários:
function Person(name, age) {
this.name = name;
this.age = age;
}
const people = [
new Person("Tom", 38),
new Person("Kate", 31),
new Person("Bob", 42),
new Person("Alice", 34),
new Person("Sam", 25)
];
// Exibimos os nomes de todos os usuários com mais de 33 anos:
const isAgeMoreThan33 = (p) => p.age > 33;
const getPersonName = (p) => p.name;
const printPersonName = (p) => console.log(p);
const view = people
.filter(isAgeMoreThan33)
.map(getPersonName)
.forEach(printPersonName);
Neste exemplo, primeiro filtramos os usuários com mais de 33 anos, depois obtemos seus nomes e, finalmente, exibimos os nomes no console.
Tom Bob Alice