As vezes precisamos trabalhar com um array de itens únicos que o usuário insere, mas como todos nós sabemos, nem sempre o usuário segue exatamente o que falamos pra ele fazer, então sempre é bom verificar os dados antes de fazer algo.
Seguindo esse princípio, hoje vamos ver como pegar um array com itens duplicados ou não, e fazer uma verificação simples para criar um novo de itens únicos.
Suponhamos que temos um array de nomes pessoais como o seguinte:
const nomes = [
'Ana',
'Bernardo',
'Clarisse',
'Domingues',
'Eduarda',
'Clarisse',
'Felipe',
'Gis',
'Domingues',
'Clarisse',
]
Como podemos ver, Domingues se repete duas vezes e Clarisse mais de duas, o que para o nosso cenário não é muito legal.
Vamos fazer isso com um velho conhecido método — ou talvez nem tanto ―, o tal método filter. Nosso código será parecido com o seguinte:
nomes.filter((nome, index, originalArray) => {
return originalArray.indexOf(nome) == index
}) // [ Ana, Bernardo, Clarisse, Domingues, Eduarda, Felipe, Gis ]
Pouco código, né?
Vamos entender como ele funciona:
- O método
filter
recebe uma funçãocallback
que deve retornar umboolean
e a chama uma vez para cada elemento do array. - O callback recebe o elemento atual, o índice dele e também o array original.
- Pegamos o tal array original e chamamos outro método:
indexOf
. - Esse outro método retorna o índice do primeiro elemento que ele encontrar e for igual ao que passamos pra ele, ou retorna -1 se não achar nada.
- Agora verificamos se o índice do elemento que
indexOf
achou é igual o atual elemento no métodofilter
. - Se for igual, o método filter vai adicionar esse elemento ao novo array, se não, apenas ignora.
Viu como é simples?
Ok, se você for como eu deve tá pensando: mas não existe um jeito menos trabalhoso pra isso?
E sim, podemos fazer com bem menos código, vejamos abaixo:
Array.from(new Set(nomes)) // [ Ana, Bernardo, Clarisse, Domingues, Eduarda, Felipe, Gis ]
Explicação curta:
- A classe
Set
pega o array e toma para si apenas os elementos que ela não pegou ainda - O método estático
from()
pega nossa instância deSet
e transforma em um array
Ainda mais simples, não?
Bônus: Implementação em Python
Em Python também podemos fazer algo bem similar ao último caso, vejamos abaixo:
nomes = [
'Ana',
'Bernardo',
'Clarisse',
'Domingues',
'Eduarda',
'Clarisse',
'Felipe',
'Gis',
'Domingues',
'Clarisse',
]
print(list(set(nomes))) # ['Bernardo', 'Domingues', 'Clarisse', 'Eduarda', 'Gis', 'Ana', 'Felipe']
E este infelizmente é o fim, espero que tenhamos aprendido coisas novas hoje.
Obrigado por chegar até aqui!