Manipulando e Trabalhando com Arrays.
Published: 2020-11-12 23:30:41

<p>
Um conteúdo que tem sido constante nos meus estudos, principalmente agora entrando em React, são os arrays.
</p>
<p>
Saber manipular arrays é algo muito importante porque é uma das principais formas que teremos para trabalhar os dados que nossas aplicações receberão. Um array é representado por colchetes [ ] e pode armazenar praticamente todo tipo de informação: strings, numbers, objects.
</p>
<p>
São diversas as formas que eles podem ser manipulados, mas essas formas merecem suas devidas atenções, porque algumas podem alterar seu array original e muitas das vezes você não vai querer isso.
</p>
<p>
Um detalhe que deve se ter atenção são os array-like, principalmente na hora de manipular o DOM, como a NodeList retornada pelo document.querySelectorAll() e as HTMLCollection retornadas por document.getElementsBy...().
</p>
<p>
Se você abrir o console do seu navegador e procurar o prototype de um Array, de uma NodeList e de um HTMLCollection você verá que o retorno será diferente e nem todos eles compartilham dos mesmos métodos, então em algum momento você poderá precisar do Array.from(), que irá converter um array-like em um array e permitir que você use os métodos de array.
</p>
<p>
Mas cuidado, analise bem o quanto realmente essa transformação é necessária e o quanto ela irá impactar sua aplicação.
</p>
<h2>Acessando elementos de um array:</h2>
<p>
Um array, como falei, é um conjunto de elementos armazenados dentro de colchetes. Você pode acessar algum elemento específico dele através do nome da variável onde ele está armazenado e a posição que ele se encontra no array.
</p>
<p>
Lembrando que o array sempre começa na posição zero, ou seja:
</p>

```
const idades = [32,21,33,43,1,12,8];

idades[0] = 32;

idades[3] = 43;
```
<em>Manterei esse array acima como base para os exemplos a seguir no artigo.</em>
<p>
Caso você tenha um array muito grande e você quer acessar um elemento que sabe que está lá, mas não sabe a posição, pode usar o método indexOf:
</p>

```
idades.indexOf(12) irá retornar 5;
``` 

<h2>Manipulação de arrays:</h2>

<h3>Métodos que modificam o array original:</h3>
<p>
Como falei acima, alguns métodos se aplicados irão mexer na estrutura do array original e devem ser utilizados com muita sabedoria.
</p>
<p>
<strong>sort()</strong>: É um método de ordenação, ele irá ordenar sempre a partir do primeiro valor de cada elemento, ou seja, um array de numbers ficará um pouco bagunçado se o método for chamado sem argumento algum.
</p>
<p>
O sort irá percorrer todos os números pegando primeiro o valor de cada elemento. É como se ele pegasse fizesse um idades[0][0],  idades[1][0],  idades[2][0],  idades[3][0],  idades[4][0],  idades[5][0],  idades[6][0]. 
</p>
<p>
Para que ele consiga ordenar por completo, precisamos passar como argumento do sort, uma arrow function que irá fazer um cálculo e a partir dele ordenar os números com um todo:
</p>
```
idades.sort() = [1, 12, 21, 32, 33, 43, 8];
idades.sort((a,b) => a - b) = [1, 8, 12, 21, 32, 33, 43];
```
<p>
Mas o que essa função faz? Ela basicamente pega o primeiro e o segundo elemento e faz uma subtração, caso o valor dê negativo, ela troca a ordem dos elementos. Depois faz com o segundo e o terceiro e assim vai até percorrer todo o array. Essa ação será realizada até que o array seja percorrido por completo e nenhum dos cálculos retorne algum valor negativo.
</p>
<p>
<strong>unshift() e push()</strong>: São dois métodos de adição de elementos em array e que retornam o length(quantidade de itens dentro de um array). O unshift() irá adicionar um elemento ao início do array enquanto o push() adicionará ao final do Array.
</p>
```
idades.unshift(14) retornará 8 que é o length de idades com um elemento a mais e idades será:
idades = [14,32,21,33,43, 1,12,8];
idades.push(5) retornará 9 que é o length de idades após o unsifht mais o push e o idades será:
idades = [14, 32,21,33,43,1,12,8, 5];
```
<p>
<strong>shift() e pop()</strong>: São dois métodos de remoção de elementos do array. O shift() remove o primeiro elemento e retorna ele. O pop() remove o último e retorna ele.
</p>
```
idades.shift() retornará 32;
idades.pop() retornará 8;
```
<p>
<strong>reverse()</strong>: inverte a ordem dos elementos dentro de um array. 
</p>
```
idades.reverse() retornará [8,12,1,43,33,21,32];
```
<p>
<strong>splice(index, remover, item1, item2,...)</strong>: ele irá manipular removendo itens e adicionando novos e retorna um array com os itens removidos. Index refere-se a posição inicial em que o splice começar a funcionar, remover refere-se a quantidade de elementos a serem removidos a partir daquela posição e os outros argumentos referem-se a itens que serão adicionados.
</p>
```
idades.splice(1, 2, 38, 24) retornará [21, 33];
idades = [32, 38, 24, 43,1,12,8];
```
<h3>
Métodos que criam novos arrays a partir de um original:
</h3>
<p>
<strong>concat()</strong>: concatena um array com os valores passados como argumento
</p>
```
const novasIdades = idades.concat(44);
novasIdades = [32,21,33,43,1,12,8, 44];
```
<p>
<strong>join(separador)</strong>: pega o array e transforma em uma string unindo pelo que for passado como argumento separador. 
</p>
```
const joinIdades = idades.join(‘-’);
joinIdades = “32-21-33-43-1-12-8”;
```
<p>
<strong>slice(início, final)</strong>: pega o array e, como o nome diz, fatia da posição início até a posição final. Se passado apenas um valor de argumento, ele irá considerar como valor de início e irá fatiar o array daquela posição até o final. Se você quiser clonar um array, pode usar o slice sem nenhum argumento.
</p>
```
const sliceIdades = idades.slice(1, 3);
sliceIdades = [21,33, 43];

const sliceIdadesUmArg = idades.slice(2);
sliceIdadesUmArg = 33,43,1,12,8];

const cloneIdades = idades.slice();
cloneIdades = [32,21,33,43,1,12,8];
```
<p>
Bom, já sabemos como manipular um array. Agora precisamos trabalhar com eles. Para isso possuímos diversos métodos.
</p>
<p>
A ideia desses métodos é que eles possam fazer uma ação que irá se repetir para cada elemento do array. Cada método nos será útil para algo, temos alguns para executar uma ação que fará alguma alteração, outro nos retornará um novo elemento com informações desse outro array, temos também métodos para pesquisar nesses arrays e retornar só o que nos interessar. Vamos ver um pouco disso agora.
</p>
<p>
Primeiro falaremos do <strong>forEach(callback(itemAtual, index, Array))</strong>. Ele serve para percorrermos um array e fazer alguma alteração, implementar algo. Imagine que você está manipulando seu DOM, tem uma série de botões de Adicionar ao Carrinho e quer que todos botões tenham a mesma função:
```
const buttons = document.querySelectorAll(‘button’)

buttons.forEach((button) =>  {
button.addEventListener(‘click’, funcaoASerExecutada)
});
```
<p>
Ele não modifica o array original, caso você queira fazer essas mudanças, precisa informar todos os argumentos e iterar a partir do array:
</p>
<p>
Imagine que você tem aquele array de idades e quer transformar cada elemento em uma string informando que se tratam realmente de idades:
</p>
```
idades.forEach((idade, index, array) => { array[index] = idade + ' anos'});

idades = ["32 anos", "21 anos", "33 anos", "43 anos", "1 anos", "12 anos", "8 anos"];
```
<p>
O objetivo do forEach não é o retorno em si do método, mas o que será feito com cada item em cada iteração, por isso seu retorno sempre será undefined.
</p>
<p>
Agora o <strong>map(callback(itemAtual, index, array))</strong>, tem a mesma premissa do forEach, a diferença está no objetivo, o objetivo do map é sim o retorno de um novo array.
</p>
```
const idadeComAnos = idades.map((idade) => {
return idade + ‘ anos’;
});

idadeComAnos = ["32 anos", "21 anos", "33 anos", "43 anos", "1 anos", "12 anos", "8 anos"];
```
<p>
O map() é muito útil para trabalharmos com arrays de objetos(algo que vamos nos deparar muito).
Suponha que você precise isolar uma propriedade de cada um dos objetos.
</p>
```
const alunos = [
	{
		nome: ‘Thiago’,
		conteúdo: ‘React’,
	},
	{
		nome: ‘Raphael’,
		conteúdo: ‘Node’,
	},
{
		nome: ‘Thays’,
		conteúdo: Redux,
	},
{
		nome: ‘Carol’,
		conteúdo: ‘Hooks’,
	}.
];

const nomeDosAlunos = alunos.map((aluno) => aluno.nome));
nomeDosAlunos = [‘Thiago’, ‘Raphael’, ‘Thays’, ‘Carol’];
```
<p>
Temos o <strong>reduce(callback(acumulador, valorAtual, index, array), valorInicial)</strong>. Diferente dos demais métodos, o reduce possui dois argumentos, um fundamental que é a callback que espera até quatro argumentos: acumulador, ele acumulará o retorno de cada iteração; o valorAtual que refere-se ao elemento do array daquela iteração, o index desse elemento e o array que seria todo array que está sendo iterado. Depois dessa callback. O segundo argumento é o valor inicial do acumulador. Esse argumento é opcional, caso não declarado, o valor inicial do acumulador será o valor do primeiro elemento do array.
</p>
<p>
Pense que você quer somar todas as idades:
</p>
```
const todasIdades = idades.reduce((acumulador, itemAtual) => acumulador + itemAtual)
todasIdades = 150;
```
<p>
Para pesquisar em um array temos 4 métodos:
</p>
<p>
<strong>some()</strong>: do inglês algum, que retornará true ou false se algum elemento do array suprir a condição passada através de uma callback;
</p>
```
idades.some((idade) => idade === 12) retornará true porque há um elemento com valor 12 no array idades.
```
<p>
<strong>every()</strong>: do inglês todo, que retornará true ou false se todos elementos do array suprirem a condição passada através de uma callback.
</p>
```
idades.every((idade) => typeof idade === ‘number’) retornará true porque todos elementos do array idades são do tipo number.
```
<p>
<strong>find()</strong>: retornará o primeiro elemento encontrado no array que suprir a condição passada através de uma callback.
</p>
```
idades.find((idade) => idade < 30) retornará 21, porque é o primeiro elemento no array cujo valor é menor que 30.
```
<p>
<strong>filter()</strong>: similar ao find, mas mais amplo, retornará todos os elementos no array que suprirem a condição passada através de uma callback.
</p>
```
idades.filter((idade) => idade < 30) retornará [21, 1,12,8];
```

Espero que esse artigo ajude na compreensão dos conceitos de manipulação de arrays e como trabalhar com os elementos contidos neles em nossas aplicações.