Iterando sobre arrays
Lucas Wendell
Posted on December 23, 2022
Nesse artigo vamos falar sobre como iterar sobre arrays em javascript
usando os principais métodos da linguagem.
Antigamente a única forma de iterar sobre arrays era através dos loops convencionais (for
, while
e etc…). Agora temos vários métodos para iterar sobre os arrays
, mas nesse artigo falaremos somente de alguns que no caso são: foreach
, reduce
, map
e o filter
.
⚠️ Dica: Para melhor compreensão dos exemplos recomendo que leia os comentários do código.
Foreach
O foreach
recebe um callback
que será executado para cada item do array
. Esse callback
recebe 3 argumentos, sendo que somente o primeiro é obrigatório, o primeiro argumento indica o item atual do array
, o segundo argumento indica o index atual e o terceiro indica o array
completo.
O método foreach
sempre retorna undefined
e por isso é recomendado usá-lo somente quando formos executar um efeito colateral
no nosso código,e isto é,toda e qualquer modificação no estado da aplicação percebida fora do destino da função
chamada.
const carros = ['ferrari', 'gol', 'audi', 'bmw']
carros.forEach((carroAtual, index, array) => {
console.log(carroAtual) // na primeira vez que esse callback for executado o carroAtual vai ser igual a ferrari, na segunda vez vai ser igual a gol e assim por diante até acabar o array
console.log(index) // Na primeira vez valerá 0 na segunda 1 e assim por diante até acabar o array
console.log(array) // Sempre vai armazenar meu array completo (['ferrari', 'gol', 'audi', 'bmw'])
})
Exemplo de uso:
Vamos imaginar que temos um array
que contém vários objetos
que representam produtos de uma loja de eletrônicos e queremos inserir o nome desses produtos em uma lista no html, nesse caso o ideal é usarmos o foreach
já que a única coisa que estamos fazendo é executar um efeito colateral.
const ul = document.querySelector('ul');
const produtos = [
{ nome: 'Celular', preco: 1227 },
{ nome: 'Notebook', preco: 3000 },
{ nome: 'Monitor', preco: 1550 },
{ nome: 'Desktop', preco: 2500 },
{ nome: 'Mouse', preco: 197 },
{ nome: 'Teclado', preco: 250 },
{ nome: 'Fone', preco: 400 },
];
produtos.forEach(produtoAtual => {
ul.innerHTML += `<li>${produtoAtual.nome}</li>`;
});
Map
O método map
é idêntico ao foreach
, vai executar seu callback
para cada item do array
até o array
acabar. A única e principal diferença é que ele retorna um novo array. Então… Quando devemos usar o map
? Devemos usar o map
quando queremos um novo array
com a mesma quantidade de itens do array
original só que com os dados transformados.
Exemplo de uso:
Podemos criar um novo array
usando map
que contém somente os preços dos meus produtos.
const produtos = [
{ nome: 'Celular', preco: 1227 },
{ nome: 'Notebook', preco: 3000 },
{ nome: 'Monitor', preco: 1550 },
{ nome: 'Desktop', preco: 2500 },
{ nome: 'Mouse', preco: 197 },
{ nome: 'Teclado', preco: 250 },
{ nome: 'Fone', preco: 400 },
];
const precos = produtos.map(produtoAtual => {
return produtoAtual.preco;
});
/*
a variavael preços agora armazena:
[
1227, 3000, 1550,
2500, 197, 250,
400
]
*/
Podemos melhorar nosso código
usando o destructuring
e usando o retorno implícito da arrow function
const precos = produtos.map(({ preco }) => preco);
Filter
Podemos imaginar o filter
exatamente como um filtrador de array’s
. Ele retorna um novo array
com os elementos filtrados.
Exemplo de uso:
Vamos imaginar que precisamos dos produtos do nosso array
que tenham o preço maior que mil reais.
const produtos = [
{ nome: 'Celular', preco: 1227 },
{ nome: 'Notebook', preco: 3000 },
{ nome: 'Monitor', preco: 1550 },
{ nome: 'Desktop', preco: 2500 },
{ nome: 'Mouse', preco: 197 },
{ nome: 'Teclado', preco: 250 },
{ nome: 'Fone', preco: 400 },
];
const produtosCaros = produtos.filter(produtoAtual => {
if (produtoAtual.preco >= 1000) {
return produtoAtual;
}
});
console.log(produtosCaros);
/*
A variavel produtosCaros agora armazena
[
{ nome: 'Celular', preco: 1227 },
{ nome: 'Notebook', preco: 3000 },
{ nome: 'Monitor', preco: 1550 },
{ nome: 'Desktop', preco: 2500 }
]
*/
Podemos melhorar nosso código
usando distructuring
, usando o retorno implícito da arrow function
e evitando o if
.
const produtosCaros = produtos.filter(({ preco }) => preco >= 1000);
console.log(produtosCaros);
Reduce
O reduce
é um pouco mais complicado de entender mas garanto que com prática ele se tornará mais fácil. O reduce
recebe dois argumentos, um callback
que pode receber 4 parâmetros acumulador, valorAtual, index, array (exatamente nessa ordem), o segundo parâmetro do reduce
é um valor default que vai ser atribuído ao primeiro parâmetro da callback
(acumulador) na primeira execução do reduce
. Devemos usar o reduce
quando a partir de um array
eu queira retornar um valor único que não seja um array
.
const numeros = [10, 20, 30, 40, 50, 60];
const soma = numeros.reduce((acumulador, valorAtual, index, array) => {
// Na primeira execução o acumulador vai ser igual ao item da primeira posição do array (10) e o valorAtual vai ser igual ao item da segunda posição do array (20)
// Na segunda execução o acumulador vai valer 30, pois a soma de 10 + 20 é igual a 30, já o valorAtual vai ser igual ao terceiro item do array (30)
// Na terceira execução o acumulador vai valer 60, pois 30 + 30 é igual a 60
// Assim vai continuar até meu array acabar
return acumulador + valorAtual;
});
console.log(soma);
Exemplo de uso:
Vamos imaginar que queremos somar o preço de todos os produtos para saber quanto temos no nosso estoque. Esse é um caso típico de uso para o reduce
já que queremos retornar um único novo valor que não é um array
.
const produtos = [
{ nome: 'Celular', preco: 1227 },
{ nome: 'Notebook', preco: 3000 },
{ nome: 'Monitor', preco: 1550 },
{ nome: 'Desktop', preco: 2500 },
{ nome: 'Mouse', preco: 197 },
{ nome: 'Teclado', preco: 250 },
{ nome: 'Fone', preco: 400 },
];
const valorTotalDoEstoque = produtos.reduce((acumulador, produtoAtual) => {
return acumulador + produtoAtual.preco;
}, 0);
console.log(valorTotalDoEstoque);
/*
A variavel valorTotalDoEstoque agora armazena: 9124
*/
Podemos melhorar o nosso código
usando destructuring
e o retorno implícito da arrow function
.
const valorTotalDoEstoque = produtos.reduce(
(acumulador, { preco }) => acumulador + preco,
0,
);
console.log(valorTotalDoEstoque);
📝 Nota: Nesse caso somos obrigados a passar o segundo parâmetro do
reduce
, se não tivéssemos passado o acumulador na primeira iteração seria um objeto e não é possível fazer uma operação matemática em um objeto.
Posted on December 23, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
November 6, 2024