Array.prototype.filter()

El m猫tode filter() crea un nou array amb tots els elements que passin el test implementat per la funci贸 que passa com a argument.

Sintaxi

arr.filter(callback[, thisArg])

Par脿metres

callback
Funci贸 que s'emprar脿 per a testejar cada element de l'array. Aquesta ser脿 invocada amb els arguments (element, posici贸, array). Ha de retornar true per als elements que es vulguin conservar i false en qualsevol altre cas.
element
El element actual que s'esta processant a l'Array.
thisArg
Opcional. Valor que rebr脿 this durant l'execuci贸 de la funci贸 callback.

Descripci贸

filter() crida la funci贸 callback proporcionada un cop per cada element de l'array, i construeix un nou array amb tots els elements per als quals la funci贸 callback retorni el valor true o b茅 un valor que pugui ser interpretat com a true. Nom茅s escridar脿 la funci贸 callback per a posicions de l'array que tinguin valors assignats; no es cridar脿 per a posicions que han estat esborrades o que mai hagin tingut assignat un element. Els elements que no passsin el test de callback ser脿n simplement ignorats i en cap cas seran afegits al nou array.

S'invoca callback tot passant-li els tres arguments seg眉ents:

  1. el valor de l'element
  2. la posici贸 de l'element
  3. L'objecte array que s'est脿 recorrent

Si es proporciona el par脿metre thisArg a la crida de filter, aquest es passar脿 a callback quan s'invoqui per a ser utilitzat com a this dins la funci贸.  En qualsevol altre cas el valor que rebr脿 this dins la funci贸 callback ser脿 undefined. El valor de this que ser脿 finalment observable dins de callback 茅s determinat d'acord a les regles habituals per a determinar el valor de this observat dins d'una funci贸.

filter() mai modificar脿 l'array des del qual s'invoca.

El rang dels elements processats per filter() es determina abans de la primera invocaci贸 de callback. Els elements que s'afegeixin a l'array un cop la crida a  filter() hagi comen莽at no seran visibles per a callback. Els elements que es modifiquin o s'esborrin durant aquest periode tindran el valor que els hi pertoqui al moment de cridar la funci贸 callback; els elements que s'hagin eliminat no es visitaran.

Exemples

Exemple: Descartar tots els valors petits

L'exemple seg眉ent utilitza filter() per a crear un array filtrat que contindr脿 tots els elements amb valors menors de 10.

function esProuGran(valor) {
  return valor >= 10;
}
var filtrat = [12, 5, 8, 130, 44].filter(esProuGran);
// filtrat val [12, 130, 44]

Exemple: Descartar entrades inv脿lides de JSON

L'exemple seg眉ent utilitza filter() per a crear un array que no contingui cap entrada de JSON amb una id num猫rica no v脿lida o amb valor menor que zero.

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('Array filtrat\n', arrByID);
// [{ id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 12.2 }]

console.log('Nombre d'entrades inv脿lides = ', invalidEntries);
// 4

Polyfill

filter() va ser afegit al standard ECMA-262 a la cinquena edici贸; degut a aix貌 aquesta funci贸 pot no ser present a totes les implementacions del standard. Es pot solucionar aquest problema inserint el codi seg眉ent al principi dels scripts, permetent l'煤s de filter() en implementacions de l'ECMA-262 que no la incorporin per defecte. Aquest algoritme 茅s exactament l'especificat per l'ECMA-262, 5a edici贸, i assumeix que fn.call s'evalua al valor original de Function.prototype.call() (en-US) i que Array.prototype.push() te el 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];

        // NOTA: T猫cnicament hauria de ser Object.defineProperty
        //       a la posici贸 seg眉ent ja que push pot veure's afectat per
        //       les propietats de Object.prototype i Array.prototype.
        //       Per貌 aquest m猫tode 茅s nou i nom茅s hi haur脿 col路lisions
        //       en casos excepcionals, aix铆q ue utilitzem l'alternativa m茅s compatible.
        if (fun.call(thisArg, val, i, t)) {
          res.push(val);
        }
      }
    }

    return res;
  };
}

Especificacions

Especificaci贸 Estat Comentaris
ECMAScript 5.1 (ECMA-262)
The definition of 'Array.prototype.filter' in that specification.
Standard Definici贸 inicial. Implementat a JavaScript 1.6.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Array.prototype.filter' in that specification.
Standard  

Compatibilitat amb navegadors

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help! (en-US)
Caracter铆stica Chrome Firefox (Gecko) Internet Explorer Opera Safari
Suport b脿sic (Yes) 1.5 (1.8) 9 (Yes) (Yes)
Caracter铆stica Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Suport b脿sic (Yes) (Yes) 1.0 (1.8) (Yes) (Yes) (Yes)

Vegeu tamb茅