Neste artigo iremos aprender comom usar o método filter() em JavaScript.

Na documentação da Mozila sobre o filter diz o seguinte:

O método filter() cria um novo array com todos os elementos que passaram no teste implementado pela função fornecida.

Ainda na documentação, encontramos o seguinte exemplo:

function isBigEnough(value) {
    return value >= 10;
}

let filtered = [12, 5, 8, 13, 14].filter(isBigEnough);

console.log(filtered);
// [12, 13, 14]

Detenha-se um pouco nele, olhe o exemplo até que você tenha “compilado” ele mentalmente.

Evoluindo com o filter

Agora vamos partir do exemplo acima e tentar procurar algumas variações.

A primeira alteração que eu fiz foi colocar o array em uma variável.

function isBigEnough(value) {
    return value >= 10;
}

let number = [12, 5, 8, 13, 14];

let filtered = number.filter(isBigEnough);

console.log(filtered);
// [12, 13, 14]

Agora vamos passar nossa função isBigEnough diretamento para filter, sem precisar definir a função (bem no estilo callback).

let number = [12, 5, 8, 13, 14];

let filtered = number.filter(function isBigEnough(value) {
    return value >= 10;
});

console.log(filtered);
// [12, 13, 14]

Agora vamos transformar a funcão em uma arrow function.

let number = [12, 5, 8, 13, 14];

let filtered = number.filter( (value) => {
    return value >= 10;
});

console.log(filtered);
// [12, 13, 14]

Agora que tal se criarmos um funcão (mais externa) para encapsular nossa pequena lógica ?

Criei a funcção filterItems.

let number = [12, 5, 8, 13, 14];

function filterItems () {
    let filtered = number.filter((value) => {
        return value >= 10;
    });
    return filtered;
}

console.log(filterItems());
// [12, 13, 14]

Percebo que não preciso da variável filtered. Faço o return diretamente.

let number = [12, 5, 8, 13, 14];

function filterItems() {
    return number.filter((value) => {
        return value >= 10;
    });
}

console.log(filterItems());
// [12, 13, 14]

Interessante seria se pudéssemos passar o array como parâmetro.

let number = [12, 5, 8, 13, 14];

function filterItems(arr) {
    return arr.filter((value) => {
        return value >= 10;
    });
}

console.log(filterItems(number));
// [12, 13, 14]

Bem massa ficou nossa função, o que você achou até aqui ?

Mas agora nos daremos um passo para trás.

Vamos retirar nosso callback de dentro da função.

let number = [12, 5, 8, 13, 14];

function isBigEnough(value) {
    return value >= 10;
}

function filterItems(arr) {
    return arr.filter(isBigEnough);
}

console.log(filterItems(number));

Agora podemos passar ele como parâmetro.

let number = [12, 5, 8, 13, 14];

function isBigEnough(value) {
    return value >= 10;
}

function filterItems(arr, callback) {
    return arr.filter(callback);
}

console.log(filterItems(number, isBigEnough));

Então, notamos que a função filterItems tem apenas uma linha e que ela não tem muita serventia.

Em outras palavras, não precisamos da função, podemos fazer isso diretamente.

let number = [12, 5, 8, 13, 14];

function isBigEnough(value) {
    return value >= 10;
}

console.log(number.filter(isBigEnough));
// [12, 13, 14]

Eu acho que essa é a melhor versão. E você o que acha ?

Ele é quase uma leitura natural: “número filtrado caso seja o maior”