Olá meus queridos, como vocês estão? Hoje falaremos sobre duas Funções de Alta Ordem pertencentes a classe Array do Javascript, chamadas Array.prototype.some()
e Array.prototype.every()
.
O que é uma Função de Alta Ordem (High Order Function)?
Antes de mais nada, vou explicar o que significa uma Função de Alta Ordem, ou do inglês, High Order Function. Funções de Alta Ordem são aquelas funções onde um ou mais parâmetros são compostos por outras funções, ou seja: uma função que recebe como argumento outra função. Apesar do conceito parecer estranho a princípio, na prática ele poderia ser exemplificado por algo assim:
Veja que a função algumaFuncaoDeAltaOrdem
recebe como parâmetro uma outra função, escrita como arrow function. Apesar de não ser obrigatório, é mais conveniente escrever a função-argumento como uma arrow function; dessa forma, utiliza-se um número menor de caracteres, mas isso fica a seu critério.
Devido o Javascript ter suporte a Funções de Alta Ordem, diversas funções desse tipo foram implementadas pela equipe que mantém a linguagem visando ajudar a manipular arrays. Dentre essas funções, as mais conhecidas são as funções map
, filter
e reduce
. Cada uma dessas funções possuem objetivos diferentes; entretanto, todas elas possuem algo em comum, pois utilizam-se de estruturas de repetição para executar uma função para cada elemento dentro do array.
Sabendo disso, vamos aprender um pouco sobre as funções some
e every
.
Básico sobre ‘Every’ e ‘Some’.
Assim como as funções map
, filter
e reduce
, as funções some
e every
também usam de estruturas de repetição para executar uma função para cada elemento do array. O retorno dessas funções sempre será um booleano (true
ou false
).
Função Some.
A função some
(em português “algum”) executa uma função para cada elemento do array. Se essa função passada retornar true
pelo menos uma vez, a função somente retornará true
; caso contrário, a função some retornará false
, por exemplo, veja a seguinte situação:
exemplo 01
Nesse exemplo, possuímos um array de objetos que representa uma turma de aprovados no vestibular. Esses objetos contém dados como: o nome da pessoa, a idade da pessoa e a nota que ela tirou. Nós queremos saber se pelo menos um dos alunos tirou a nota máxima (nota 10) nessa turma.
Como poderíamos fazer para saber se pelo menos uma dessas pessoas tirou a nota máxima? Bom, a solução clássica seria usando estruturas de repetição, não é mesmo? Algo assim:
Acredito que vocês concordariam comigo que esse código é meio extenso e um pouco feio não é? A função some
é perfeita para casos como esse… Vejamos como seria a solução com a função some
:
Vejam como fica menos complicado usando a função some. Com ela, não precisamos nos preocupar em criar uma estrutura de repetição, só precisamos fazer com que nossa função-argumento retorne um critério de avaliação. no caso, o critério é a nota do aluno ser igual a 10; se esse critério for verdadeiro pelo menos uma vez, a função some retornará true
.
Repare que escrevi a arrow function de forma verbosa. Fiz isso para que fique mais claro quais parâmetros a função-argumento deve possuir, lembrando que esses parâmetros não são obrigatórios, ou seja: a função-argumento não precisa usar esses parâmetros. Entretanto, se você for usá-los, deverá coloca-los na ordem que eu coloquei: o primeiro parâmetro é o elemento do array naquele momento do loop; o segundo, o índice numérico daquele elemento e o terceiro é o array original. Naturalmente, fica a seu critério como utilizar esses parâmetros.
Para obter mais informações sobre a função some
, veja a documentação aqui.
Função Every.
A função every
(em português, “todos”) opera de forma semelhante à função some
. Entretanto, ela retorna true
somente se a função-argumento passada retornar true
para todos os elementos do array; do contrário, a função every
retornará false
. Vejamos mais um caso de uso:
Exemplo 02
Digamos que nós temos um array objetos, onde cada objeto representa os dados de lotes de caixas de leite que passaram por um teste de qualidade. Seus atributos são: o número do lote, quantidade de caixas de leite no lote e o resultado do teste de qualidade como aprovado
ou reprovado
. precisamos saber se, naquela produção, todas os lotes possuem 50 caixas de leite e se todos os lotes foram aprovados.
Mostrando mais uma vez a abordagem mais direta, utilizamos estruturas de repetição para executar o que a situação pede:
Vejam que, nesse caso, o algoritmo consumiu um pouco mais de linhas de código que a situação anterior. Vamos ver como poderíamos resolver a mesma situação com a função every
:
Note que, mesmo usando variáveis com nomes grandes, o código ainda assim ficou bem menor do que ficaria na a forma “clássica”. Nosso foco foi implementar a nossa arrow function que retorna a condição de avaliação que será aplicada em cada elemento do array. Se essa condição for true
para todos os elementos do array, então o retorno da função every
será true
; caso contrário, será false
.
Lembrando, mais uma vez implementei todos os parâmetros da função-argumento que é passada para a função every
. Esses argumentos são opcionais; caso decida usá-los, lembre-se que a ordem deles é importante. eles representam (respectivamente da esquerda para a direita): o elemento lido naquele momento do array, o índice correspondente desse elemento e, por último, o array original.
Para mais informações sobre a função every veja a documentação aqui.
Conclusão
Nesse breve artigo, aprendemos um pouco sobre Funções de Alta Ordem. Também vimos, na prática, duas funções extremamente úteis pertencentes a classe Array do Javascript, chamadas every
e some
.
Espero que tenha sido uma leitura proveitosa para vocês. Fiquem à vontade para deixar suas críticas e elogios… Abraço a todos!