O método filter() cria um novo array com todos os elementos que passaram ao teste (retornaram true) implementado pela função fornecida.
Sintaxe
arr.filter(callback[, thisArg])
Parâmetros
callback- Função para testar cada elemento do array. Invocada com os parâmetros
(element, index, array). Retorna true para manter o elemento, false caso contrário. thisArg- Opcional. Valor para ser usado como
thisquando executar ocallback.
Descrição
filter() chama a função callback fornecida, uma vez para cada elemento do array, e constrói um novo array com todos os valores para os quais o callback retornou o valor true ou um valor que seja convertido para true. O callback é chamado apenas para índices do array que possuem valores atribuídos; Ele não é invocado para índices que foram excluídos ou para aqueles que não tiveram valor atribuído. Elementos do array que não passaram no teste do callback são simplesmente ignorados, e não são incluídos no novo array.
callback é invocado com estes três argumentos:
- o valor do elemento
- o índice do elemento
- o objeto do array a ser preenchido
So o parâmetro thisArg for provido para o filter, ele será passado para o callback quando invocado, para ser usado como o valor do this. Caso contrário, será passado undefined como o valor de this. O valor do this finalmente observado pela função de callback é determinado de acordo com a regra que define o valor do this geralmente visto por uma função.
filter() não altera a array a partir da qual foi invocado.
O intervalo de elementos processados pela função filter() é definido antes da invocação do primeiro callback. Elementos que forem adicionados ao array depois que a invocação do filter() não serão visitados pelo callback. Se elementos existentes no array forem alterados ou deletados, o valor deles passado para o callback será o valor que eles tenham quando o filter() visitá-los; Elementos que forem deletados não são visitados..
Examples
Example: Filtering out all small values
Os exemplos a seguir usa filter() para criar um array filtrado cujo todos os elementos com valores menores que 10 foram removidos.
function isBigEnough(value) {
return value >= 10;
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
// filtered is [12, 130, 44]
Example: Filtrando entradas inválidas para JSON
O exemplo a seguir usa filter() para criar um json filtrado com todos seus elementos diferentes de zero, e id numérido.
var arr = [
{ id: 15 },
{ id: -1 },
{ id: 0 },
{ id: 3 },
{ id: 12.2 },
{ },
{ id: null },
{ id: NaN },
{ id: 'undefined' }
];
var invalidEntries = 0;
function filterByID(obj) {
if ('id' in obj && typeof(obj.id) === 'number' && !isNaN(obj.id)) {
return true;
} else {
invalidEntries++;
return false;
}
}
var arrByID = arr.filter(filterByID);
console.log('Filtered Array\n', arrByID);
// [{ id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 12.2 }]
console.log('Number of Invalid Entries = ', invalidEntries);
// 4
Polyfill
filter() foi adicionado ao padrão ECMA-262 na 5ª edição; assim como pode não estar presente em todas as implementações do padrão. Você pode trabalhar com isso adicionando o seguinte código no início de seus scripts, permitindo o uso do filter() na implementação ECMA-262 que não tem suporte nativo. Esse algoritmo é exatamente aquele especificado na 5ª edição do ECMA-262, assumindo que fn.call veja o valor original de Function.prototype.call(), e que Array.prototype.push() tenha seu valor original.
if (!Array.prototype.filter) {
Array.prototype.filter = function(fun/*, thisArg*/) {
'use strict';
if (this === void 0 || this === null) {
throw new TypeError();
}
var t = Object(this);
var len = t.length >>> 0;
if (typeof fun !== 'function') {
throw new TypeError();
}
var res = [];
var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
for (var i = 0; i < len; i++) {
if (i in t) {
var val = t[i];
// NOTE: Technically this should Object.defineProperty at
// the next index, as push can be affected by
// properties on Object.prototype and Array.prototype.
// But that method's new, and collisions should be
// rare, so use the more-compatible alternative.
if (fun.call(thisArg, val, i, t)) {
res.push(val);
}
}
}
return res;
};
}
Especificações
| Especificação | Status | Comentário |
|---|---|---|
| ECMAScript 5.1 (ECMA-262) The definition of 'Array.prototype.filter' in that specification. |
Standard | Definição inicial. Implementada no JavaScript 1.6. |
| ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Array.prototype.filter' in that specification. |
Standard |
Compatibilidade de Browser
| Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| Suporte Básico | (Yes) | 1.5 (1.8) | 9 | (Yes) | (Yes) |
| Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|
| Suporte Básico | (Yes) | (Yes) | 1.0 (1.8) | (Yes) | (Yes) | (Yes) |