mozilla

Compare Revisions

Array.prototype.filter()

Change Revisions

Revision 496049:

Revision 496049 by patrickdw on

Revision 496053:

Revision 496053 by patrickdw on

Title:
Array filter method
Array filter method
Slug:
Web/JavaScript/Reference/Global_Objects/Array/filter
Web/JavaScript/Reference/Global_Objects/Array/filter
Tags:
"ECMAScript5", "Array", "Array methods", "JavaScript 1.6"
"ECMAScript5", "Array", "Array methods", "JavaScript 1.6"
Content:

Revision 496049
Revision 496053
n96// Production steps of ECMA-262, Edition 5, 15.4.4.18n
97// Reference: <a class="external" href="http://es5.github.com/#x1
>5.4.4.18" rel="freelink">http://es5.github.com/#x15.4.4.18</a> 
98if ( !Array.prototype.forEach ) {96if (!Array.prototype.filter)
97{
98  Array.prototype.filter = function(fun /*, thisp */)
99  {
100    "use strict";
n100  Array.prototype.forEach = function( callback, thisArg ) {n
101 
102    var T, k;
103 
104    if ( this == null ) {102    if (this == null)
105      throw new TypeError( " this is null or not defined" );103      throw new TypeError();
104 
105    var t = Object(this);
106    var len = t.length &gt;&gt;&gt; 0;
107    if (typeof fun != "function")
108      throw new TypeError();
109 
110    var res = [];
111    var thisp = arguments[1];
112    for (var i = 0; i &lt; len; i++)
113    {
114      if (i in t)
115      {
116        var val = t[i]; // in case fun mutates this
117        if (fun.call(thisp, val, i, t))
118          res.push(val);
119      }
t108    // 1. Let O be the result of calling ToObject passing the |tht122    return res;
>is| value as the argument. 
109    var O = Object(this);
110 
111    // 2. Let lenValue be the result of calling the <a href="http
>s://developer.mozilla.org/Get" title="Get">Get</a> internal metho 
>d of O with the argument "length". 
112    // 3. Let len be ToUint32(lenValue).
113    var len = O.length &gt;&gt;&gt; 0; // Hack to convert O.lengt
>h to a UInt32 
114 
115    // 4. If IsCallable(callback) is false, throw a TypeError exc
>eption. 
116    // See: <a class="external" href="http://es5.github.com/#x9.1
>1" rel="freelink">http://es5.github.com/#x9.11</a> 
117    if ( {}.toString.call(callback) != "[object Function]" ) {
118      throw new TypeError( callback + " is not a function" );
119    }
120 
121    // 5. If thisArg was supplied, let T be thisArg; else let T b
>e undefined. 
122    if ( arguments.length &gt; 1 ) {
123      T = thisArg;
124    }
125 
126    // 6. Let k be 0
127    k = 0;
128 
129    // 7. Repeat, while k &lt; len
130    while( k &lt; len ) {
131 
132      var kValue;
133 
134      // a. Let Pk be ToString(k).
135      //   This is implicit for LHS operands of the in operator
136      // b. Let kPresent be the result of calling the <a href="ht
>tps://developer.mozilla.org/HasProperty" title="HasProperty">HasP 
>roperty</a> internal method of O with argument Pk. 
137      //   This step can be combined with c
138      // c. If kPresent is true, then
139      if ( k in O ) {
140 
141        // i. Let kValue be the result of calling the <a href="ht
>tps://developer.mozilla.org/Get" title="Get">Get</a> internal met 
>hod of O with argument Pk. 
142        kValue = O[ k ];
143 
144        // ii. Call the <a href="https://developer.mozilla.org/Ca
>ll" title="Call">Call</a> internal method of callback with T as t 
>he this value and 
145        // argument list containing kValue, k, and O.
146        callback.call( T, kValue, k, O );
147      }
148      // d. Increase k by 1.
149      k++;
150    }
151    // 8. return undefined

Back to History