Javascript filter(): filtrando os elementos de um array!

Utilizar estruturas de repetições para encontrar um determinado conteúdo em uma array, além de ser mais trabalhoso, dificulta a manutenção do código. Isso ocorre em função do aumento de linhas para desenvolver a função de retorno dos dados desejados. Felizmente, temos uma alternativa para facilitar essa tarefa: o método JavaScript filter().

Como o próprio nome sugere, ele tem a função de filtrar o conteúdo de uma array. Faz parte de um conjunto de recursos disponíveis na linguagem JavaScript para a manipulação desse tipo de objeto. Por isso, é importante entender como funciona para saber como utilizá-lo em diferentes situações.

Para que você conheça um pouco mais sobre esse recurso, fizemos este post em que vamos mostrar:

  • O que é e como funciona o método JavaScript filter()?
  • Como é a sintaxe?
  • Quais os 5 exemplos mais interessantes do método filter() na prática?
  • O que é polyfill para o filter()?
  • Qual a compatibilidade com os navegadores?

Vamos lá? Boa leitura!

O que é e como funciona o método JavaScript filter()?

O método filter() é um recurso que permite fazer a filtragem de elementos com apenas poucas linhas de comandos. Isso facilita o entendimento e a manutenção do código pelas pessoas que desenvolvem softwares.

Na prática, ele faz a leitura dos elementos da array em busca de um valor de referência passado por meio de uma função callback. Ao fazer o teste em cada elemento, o método retorna um ou mais conteúdos que atendam à especificação indicada na função callback e armazena o resultado em uma nova variável do tipo array.

Portanto, o resultado será o de todos os elementos que satisfaçam a condição do filtro. Vale ressaltar que a array original não sofre nenhum tipo de alteração pelo método filter().

Como é a sintaxe?

Antes de explicar a sintaxe do método filter(), vamos falar rapidamente sobre o que significa uma função callback. Na prática, ela é uma função de retorno, ou seja, ela executa uma ação para que seu resultado seja utilizado em uma outra função anterior.

Se você quiser saber um pouco mais sobre o assunto, dê uma olhada nesses exemplos práticos de sua utilização. É importante entender esse conceito, pois a sintaxe do método filter() utiliza uma função callback. Veja como é o comando:

var novaArray = arrayOriginal.filter(function(valorAtual, indice, varArray), thisArgumento))

No qual:

  • novaArray: corresponde a uma nova variável do tipo array na qual são armazenados todos os resultados que satisfaçam a condição de filtragem;
  • arrayOriginal: é o objeto original que serve de base para a aplicação do método filter;
  • Função callback:
  • valorAtual: é obrigatório e corresponde ao valor do elemento atual da array;
  • índice: é opcional e referente ao índice do atual elemento;
  • varArray: valor opcional e corresponde à array a que o valorAtual pertence;
  • thisArgumento: valor opcional que funciona como o valor “this” ao executar a função callback.

Quais os 5 exemplos mais interessantes do método filter() na prática?

Nada melhor que exemplos práticos para visualizar o que diz a teoria. Por isso, confira, a seguir, algumas formas de utilizar o método filter().

Exemplo 1

Vamos imaginar uma variável do tipo array com uma sequência numérica de um a dez, e precisamos separar todos os elementos pares. Confira o código.

var numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
function buscarNumerosPares (value) {
    if (value % 2 == 0) 
    return value;
}
var numerosPares = numeros.filter(buscarNumerosPares);
console.log(numerosPares);


Na primeira linha do código foi feita a declaração da variável array com os elementos necessários. A seguir, declaramos uma função callback, chamada buscarNumerosPares, que recebe cada elemento da array e faz um teste para identificar os números pares.

Isso é feito por meio da divisão de cada elemento por dois e, caso o restante da operação seja zero, significa que o número avaliado é par. Vale ressaltar que o operador % utilizado no código retorna o valor restante da divisão entre o elemento por dois. Caso ele seja zero, identifica o número avaliado como par.

Na próxima linha, finalmente, utilizamos o método filter(). Primeiro, declaramos uma variável do tipo array chamada numerosPares para armazenar o retorno do processamento. O comando numeros.filter(buscarNumerosPares) faz a chamada à função callback correspondente, por meio do envio de cada elemento da variável números.

Existem outras formas de escrever esse mesmo código. Veja o algoritmo, a seguir.

var numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var retorno = numeros.filter(pares => (pares %2)== 0);
console.log(retorno);


Perceba que, nesse exemplo, fazemos a declaração da variável de retorno e já atribuímos a ela o resultado do método filter(). Para isso, utilizamos a arrow function, que é uma forma mais simples de utilizar funções. Dessa forma, o que vier depois da declaração => é entendido como uma função. A saída para os dois códigos acima é a mesma.

 /*Saída:
  Array(5) [2, 4, 6, 8, 10]
 */


Exemplo 2

No exemplo a seguir, buscaremos na variável do tipo array quais estados se iniciam com a letra S. Confira o código.

var estados = ["São Paulo", "Minas Gerais", "Rio de Janeiro", "Rio Grande do Norte", "Santa Catarina", "Acre"];
function retornaEstado (value){
    if (value.charAt(0) == "S") 
    return value;
}
var resultado = estados.filter(retornaEstado);
console.log(resultado);


Em primeiro lugar, declaramos a variável estados com cinco elementos com as iniciais variadas. A seguir, fizemos uma função chamada retornaEstado, que lê o primeiro caractere de cada elemento em busca da letra S.

Perceba que para ler o primeiro caractere, utilizamos o método charAt(), que retorna o caractere de uma string, de acordo com o índice referenciado. No nosso exemplo, buscamos o índice 0, pois corresponde ao caractere inicial da string.

O próximo passo é utilizar a função. Para isso, criamos a variável do tipo array chamada resultado para armazenar o retorno do método filter(). Então, aplicamos o método na array estados e chamamos a função retornaEstado, que retornará dois elementos: “São Paulo” e “Santa Catarina”.

Assim como no exemplo anterior, podemos utilizar a arrow function para escrever esse código. Veja como ele fica ao utilizarmos essa opção, que terá o mesmo resultado.

var estados = ["São Paulo", "Minas Gerais", "Rio de Janeiro", "Rio Grande do Norte", "Santa Catarina", "Acre"];
var resultado = estados.filter( estadosComS  => (estadosComS.charAt(0) == "S"));
console.log(resultado);


Exemplo 3

Neste exemplo, vamos falar sobre uma array de variáveis do tipo objeto. É importante dizer que o tipo objeto é utilizado quando queremos armazenar mais de uma característica de um mesmo elemento.

Por exemplo, podemos ter uma lista de produtos com as seguintes informações sobre cada item: id, descrição e categoria do produto. Portanto, podemos criar um objeto chamado produtos que contenha essas características e armazenar vários desses objetos em uma array.

Em JavaScript, cada característica do objeto é chamada de propriedade. Assim, um objeto pode ter várias propriedades, que contêm um identificador e o seu valor correspondente. Podemos utilizar o método filter() para acessar os elementos em uma array de objetos. Confira o exemplo.

var produtos = [
    {id: 1, descricao: "Smartphone", categoria: "Eletrônico"},
    {id: 2, descricao: "Notebook", categoria: "Eletrônico"},
    {id: 3, descricao: "Geladeira", categoria: "Eletrodoméstico"},
    {id: 4, descricao: "Liquidificador", categoria: "Eletrodoméstico"},
    {id: 5, descricao: "Fogão", categoria: "Eletrodoméstico"}
]
function retornaEletronico (value){
    if (value.categoria == "Eletrônico")
    return value;
}
var produtosEletronico = produtos.filter(retornaEletronico);
produtosEletronico.forEach(produtoEletro => { 
    console.log(produtoEletro);
})
/* saída:
Object {descricao: "Smartphone", categoria: "Eletrônico"}
Object {descricao: "Notebook", categoria: "Eletrônico"}
*/


Primeiramente, declaramos a array com cinco objetos que vamos chamar de produtos. A seguir, declaramos uma função chamada retornaEletronico, que devolverá todos os objetos que sejam da categoria eletrônico.

Perceba que a validação na função acessa a propriedade categoria para compará-la com o conteúdo desejado. Na próxima linha, é feita a declaração da variável de retorno para a aplicação do javascript filter object.

A seguir, exibimos o resultado na console dos objetos selecionados pelo filtro. Para isso, utilizamos a estrutura de repetição forEach, que lê todos os elementos da array e executa o comando console.log para exibir o resultado correspondente ao depurarmos o código.

Exemplo 4

Neste exemplo, vamos utilizar a mesma situação do anterior. Entretanto, vamos desenvolver o código com a arrow function e selecionar os produtos que sejam da categoria eletrodomésticos. Veja como fica o código.

var produtos = [
    {id: 1, descricao: "Smartphone", categoria: "Eletrônico"},
    {id: 2, descricao: "Notebook", categoria: "Eletrônico"},
    {id: 3, descricao: "Geladeira", categoria: "Eletrodoméstico"},
    {id: 4, descricao: "Liquidificador", categoria: "Eletrodoméstico"},
    {id: 5, descricao: "Fogão", categoria: "Eletrodoméstico"} 
]
var produtosEletrodomestico = produtos.filter(produto => produto.categoria == "Eletrodoméstico");
produtosEletrodomestico.forEach(produto => { 
    console.log(produto);
});
/* saída:
Object {descricao: "Geladeira", categoria: "Eletrodoméstico"}
Object {descricao: "Liquidificador", categoria: "Eletrodoméstico"}
Object {descricao: "Fogão", categoria: "Eletrodoméstico"}
*/


Criamos a variável produtosEletrodomesticos e já aplicamos o filtro para selecionar, em cada produto, a propriedade categoria que atenda à condição desejada. No próximo passo, todos os elementos armazenados na nova array são exibidos na console por meio da estrutura de repetição forEach.

Exemplo 5

Outra forma de utilizar o filter() é para criar uma nova array com elementos válidos. Imagine uma array que tenha objetos nulos ou indefinidos junto a outros conteúdos. Portanto, o JavaScript array filter() pode ser uma alternativa para selecionar os elementos que tenham os dados consistentes. Confira.

var produtos = [
    {id: 1, descricao: "Smartphone", categoria: "Eletrônico"},
    {id: 2, descricao: "Notebook", categoria: "Eletrônico"},
    {id: 3, descricao: "Geladeira", categoria: "Eletrodoméstico"},
    {},
    {id: null },
    {id: NaN},
    {id: 'undefined' },
    {id: 4, descricao: "Liquidificador", categoria: "Eletrodoméstico"},
    {id: 5, descricao: "Fogão", categoria: "Eletrodoméstico"}
]
function filtrarPorDescricao(value) {
    if ('id' in value && typeof(value.id) === 'number' && !isNaN(value.id)) {
         return value;
    } 
}
var produtosValidos = produtos.filter(filtrarPorDescricao);
produtosValidos.forEach(produto => { 
    console.log(produto);
})
/* saída
Object {id: 1, descricao: "Smartphone", categoria: "Eletrônico"}
Object {id: 2, descricao: "Notebook", categoria: "Eletrônico"}
Object {id: 3, descricao: "Geladeira", categoria: "Eletrodoméstico"}
Object {id: 4, descricao: "Liquidificador", categoria: "Eletrodoméstico"}
Object {id: 5, descricao: "Fogão", categoria: "Eletrodoméstico"}  
*/

No código acima, adicionamos alguns elementos inválidos e nulos para executar o teste. A seguir, fizemos uma função, chamada filtrarPorDescricao, que identifica os elementos inválidos e retorna apenas os que tiverem um valor numérico armazenado na propriedade id.

Dessa forma, criamos uma nova array de objetos apenas com produtos válidos e listamos o resultado na console do navegador.

O que é polyfill para o filter()?

O método filter() foi adicionado ao JavaScript a partir da EMCA-262 5.1th Edition, que é a especificação de linguagem de script implementada pelo JavaScript. Isso significa que alguns navegadores, especialmente os mais antigos, podem não estar preparados para atender às mudanças apresentadas com a nova especificação.

O método filter(), por exemplo, é um dos recursos que podem não funcionar nesses navegadores. Por isso, existem os polyfills, que são códigos que devem ser adicionados no início do código que utiliza esse recurso.

Assim, caso a pessoa utilize algum desses navegadores, não tem a funcionalidade interrompida por falhas por incompatibilidade. Vale ressaltar que o código pode ser encontrado na página do MDN Web Docs, na documentação sobre o método filter().

Qual a compatibilidade com os navegadores?

Como dissemos no tópico anterior, o método filter() foi adicionado ao JavaScript a partir da 5.1 edição da EMCA-262, que foi lançada em 2011. Portanto, é um recurso relativamente novo.

Entretanto, os principais navegadores oferecem suporte a esse recurso. Confira, a seguir, a partir de qual versão essa funcionalidade roda perfeitamente em cada navegador.

  • Chrome: 1;
  • Edge: 12;
  • Firefox: 1.5;
  • Internet Explorer: 9;
  • Opera: 9.5;
  • Safari: 3;
  • Android webview: <=37;
  • Chrome for Android: 18;
  • Firefox for Android: 4;
  • Opera for Android: 10.1;
  • Safari on iOS: 1;
  • Samsung Internet: 1.0.

O método JavaScript filter() é um recurso que permite a manipulação de elementos em uma array. Trata-se de uma forma de reduzir as linhas de código, pois é possível utilizá-lo em substituição às estruturas de repetição usadas para selecionar elementos em uma array. Por isso, é importante entender como ele funciona para utilizá-lo da melhor forma em suas aplicações web.

Gostou do nosso conteúdo sobre as formas de aplicação do método filter()? Então, confira este guia inicial imperdível sobre expressões regulares!