De filter()
method maakt een nieuwe array aan met enkel die elementen die de test doorstaan van een functie naar keuze.
Syntax
var new_array = arr.filter(callback[, thisArg])
Parameters
callback
- Functie, onderwerpt ieder element aan een test. Wordt aangeroepen met argumenten
(element, index, array)
. Levert als resultaat de waardetrue
om het element te behouden, of andersfalse
. thisArg
- Optioneel. Te gebruiken als de
this
waarde, wanneer eencallback
wordt uitgevoerd.
Beschrijving
filter()
roept een geleverde callback
functie één keer aan voor ieder element van een array en maakt een nieuwe array aan met alle waarden waarvoor de callback
een waarde welke kan worden omgezet naar true (truthy values)
retourneert. callback
wordt alleen aangeroepen voor indices van de array, welke een waarde bezitten; deze wordt niet gebruikt voor indices welke zijn verwijderd, of welke nooit een waarde hebben verkregen. Array elements die niet de callback
test doorstaan, worden simpelweg overgeslagen en worden niet in de nieuwe array opgenomen.
callback
wordt aangeroepen met drie argumenten:
- de waarde (value) van het element
- de index van het element
- het Array object dat wordt veranderd
Wanneer een thisArg
parameter wordt toegevoegd aan filter
, zal deze worden doorgegeven aan callback
wanneer deze wordt aangeroepen, om gebruikt te worden als this
waarde. In het andere geval zal de waarde undefined
worden gebruikt als this
waarde. De this
waarde, uiteindelijk zichtbaar in callback
wordt bepaald door de gebruikelijke regels om de this
waarde te bepalen voor een functie.
filter()
verandert de array zelf niet, van waaruit deze als method wordt aangeroepen.
De reeks (range) van elementen welke door filter()
onderhanden wordt genomen, wordt al voor de eerste aanroep van callback
bepaald. Elementen, die aan de originele array worden toegevoegd nadat de filter()
method was aangeroepen, zullen niet worden onderworpen aan callback
. Indien bestaande elementen worden gewijzigd, of verwijderd, dan zal hun waarde, zoals overgedragen aan callback
, de waarde zijn als die is, op het moment dat filter()
ze bezoekt; elementen die worden verwijderd worden ook niet in behandeling genomen.
Voorbeelden
Filter lage waarden
Het volgende voorbeeld gebruikt filter()
om een gefilterde array aan te maken, waarbij alle waarden onder de 10 zijn verwijderd.
function isBigEnough(value) { return value >= 10; } var filtered = [12, 5, 8, 130, 44].filter(isBigEnough); // filtered is [12, 130, 44]
Filter foutieve items van JSON
Het volgende voorbeeld gebruikten filter()
voor een gefilterde json van alle elementen met een numerieke id
.
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('Gefilterde Array\n', arrByID); // Gefilterde Array // [{ id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 12.2 }] console.log('Number of Invalid Entries = ', invalidEntries); // Number of Invalid Entries = 4
Polyfill
filter()
werd toegevoegd aan de ECMA-262 standaard in de 5de editie; als deze kan het zijn dat deze niet in alle toepassingen van de standaard voorkomt. Als alternatief kun je de volgende code aan het begin van je scripts zetten, waardoor het gebruik van filter()
word toegestaan binnen ECMA-262 implementaties, die dit nog niet van nature ondersteunen. Het algoritme is precies die, zoals gespecificeerd in ECMA-262, 5de editie, aangenomen dat fn.call
resulteert in de beginwaarde van Function.prototype.call()
, en dat Array.prototype.push()
nog zijn originele waarde heeft.
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; }; }
Specificaties
Specificatie | Status | Commentaar |
---|---|---|
ECMAScript 5.1 (ECMA-262) The definition of 'Array.prototype.filter' in that specification. |
Standard | Initiele definitie. Geimplementeerd in JavaScript 1.6. |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Array.prototype.filter' in that specification. |
Standard | |
ECMAScript 2017 Draft (ECMA-262) The definition of 'Array.prototype.filter' in that specification. |
Draft |
Browser compatibiliteit
Eigenschap | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (Yes) | 1.5 (1.8) | 9 | (Yes) | (Yes) |
Eigenschap | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | 1.0 (1.8) | (Yes) | (Yes) | (Yes) |