La méthode filter() crée et retourne un nouveau tableau contenant tous les éléments du tableau d'origine pour lesquels la fonction callback retourne true.
function suffisammentGrand(element) {
return element >= 10;
}
var filtre = [12, 5, 8, 130, 44].filter(suffisammentGrand);
// filtre vaut [12, 130, 44]
Syntaxe
var new_array = arr.filter(callback[, thisArg])
Paramètres
callback- La fonction de test (ou prédicat) à appliquer à chaque élément du tableau. Cette fonction est appelée avec les arguments suivants :
element- L'élément à traiter
index- Son indice.
array- Le tableau complet
truesi l'élément doit être conservé pour le tableau résultat etfalsesinon. thisArg- Objet à utiliser en tant que
thisquand la fonctioncallbackest exécutée.
Valeur de retour
Un nouveau tableau contenant les éléments qui respectent la condition du filtre.
Description
filter() appelle la fonction callback fournie pour chacun des éléments d'un tableau, et construit un nouveau tableau contenant tous les éléments pour lesquels l'appel de callback retourne true ou une valeur équivalente à true dans un contexte booléen. La fonction callback n'est utilisée que pour les éléments du tableau ayant une valeur assignée - les index supprimés ou pour lesquels il n'y a jamais eu de valeur ne sont pas pris en compte. Les éléments du tableau qui ne passent pas le test effectué par la fonction callback sont simplement ignorés, et ne sont pas inclus dans le nouveau tableau.
La fonction callback est appelée avec trois arguments :
- la valeur de l'élément courant
- l'index de l'élément courant
- l'objet
Arraytraversé
Si le paramètre thisArg est fourni, il sera utilisé comme objet this lors de l'appel de la fonction callback. Sinon, la valeur undefined sera utilisée à la place. Par ailleurs, la valeur de this accessible depuis la fonction callback est déterminée selon les règles usuelles de pour déterminer la valeur this au sein d'une fonction.
filter() ne modifie pas le tableau d'origine.
La liste des éléments parcourus par filter() est définie avant la première invocation de la fonction callback. Les éléments qui sont ajoutés à la liste après le début de l'appel de filter() (grâce à la fonction callback par exemple) ne seront pas visités. Si des éléments existants de la liste sont modifiés ou supprimés, la valeur fournie à la fonction callback sera leur valeur au moment où filter() les visite - les éléments supprimés ne seront pas traités par la fonction.
Exemples
Filtrer les petites valeurs
L'exemple suivant utilise filter afin de créer une liste filtrée où on a retiré tous les éléments dont la valeur est inférieure à 10.
function suffisammentGrand(element) {
return element >= 10;
}
var filtre = [12, 5, 8, 130, 44].filter(suffisammentGrand);
// filtre vaut [12, 130, 44]
Filtrer des éléments JSON invalides et les trier en fonction d'un identifiant avec filter()
Dans l'exemple qui suit, on utilise filter() afin de créer un objet JSON qui contient des éléments avec un id qui est un entier.
var arr = [
{ id: 15 },
{ id: -1 },
{ id: 0 },
{ id: 3 },
{ id: 12.2 },
{ },
{ id: null },
{ id: NaN },
{ id: 'undefined' }
];
var elementsInvalides = 0;
function filtrerParID(obj) {
if (obj.id !== undefined && typeof(obj.id) === 'number' && !isNaN(obj.id)) {
return true;
} else {
elementsInvalides++;
return false;
}
}
var arrByID = arr.filter(filtrerParID);
console.log('Tableau filtré\n', arrByID);
// Le tableau filtré est :
// [{ id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 12.2 }]
console.log('Nombre d\'éléments invalides = ', elementsInvalides);
// Nombre d'éléments invalides 4
Prothèse d'émulation (polyfill)
Array.prototype.filter() a été ajoutée avec la cinquième édition du standard ECMA-262 - ainsi elle pourrait ne pas être présente dans toutes les implémentations du standard. Ce problème peut être contourné en ajoutant le code suivant au début des scripts et permettra d'utiliser filter au sein d'implémentations qui n'en bénéficient pas nativement. Cet algorithme est celui exactement spécifié par la cinquième édition d'ECMA-262, en considérant que callbackfn.call est évaluée avec la valeur d'origine de Function.prototype.call et que Array.prototype.push a sa valeur d'origine.
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;
// NOTE : fix to avoid very long loop on negative length value
if (len > t.length || 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: Techniquement on devrait utiliser Object.defineProperty
// pour le prochain index car push peut être affecté
// par les propriétés d'Object.prototype et d'Array.prototype.
// Cependant cette méthode est récente et les cas de collisions
// devraient rester rares : on préfère donc l'alternative la plus
// compatible.
if (fun.call(thisArg, val, i, t))
res.push(val);
}
}
return res;
};
}
Spécifications
| Spécification | État | Commentaires |
|---|---|---|
| ECMAScript 5.1 (ECMA-262) La définition de 'Array.prototype.filter' dans cette spécification. |
Standard | Définition initiale. Implémentée avec JavaScript 1.6. |
| ECMAScript 2015 (6th Edition, ECMA-262) La définition de 'Array.prototype.filter' dans cette spécification. |
Standard | |
| ECMAScript 2017 Draft (ECMA-262) La définition de 'Array.prototype.filter' dans cette spécification. |
Projet |
Compatibilité des navigateurs
| Fonctionnalité | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| Support simple | (Oui) | 1.5 (1.8) | 9 | (Oui) | (Oui) |
| Fonctionnalité | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|
| Support simple | (Oui) | (Oui) | 1.0 (1.8) | (Oui) | (Oui) | (Oui) |