首页 > 代码库 > filter

filter

在原数组里面过滤出新的数组。

这个功能曾经在js中是多么暴力的一段代码。

通过for循环和正则表达式等等。。

最近正要做这个。在我找度娘之前,涛哥给我介绍了一个叫做filter的内置方法。

ECMAScript 5里面有9个新的对于数组的操作方法,filter就是一个:

Array.prototype.filter ( callbackfn [ , thisArg ] )

 callbackfn 应该是个函数,它接受三个参数并返回一个可转换为布尔值 true 和 false 的值。filter 按照索引的升序,对数组里存在的每个元素调用一次 callbackfn,并用使 callbackfn 返回 true 的所有值构造一个新数组。callbackfn 只被实际存在的数组元素调用;它不会被缺少的数组元素调用。

 如果提供了一个 thisArg 参数,它会被当作 this 值传给每个 callbackfn 调用。如果没提供它,用 undefined 替代。

 调用 callbackfn 时将传入三个参数:元素的值,元素的索引,和遍历的对象。

 对 filter 的调用不直接更改对象,但是对 callbackfn 的调用可能更改对象。

 filter 处理的元素范围是在首次调用 callbackfn 之前设定的。在 filter 调用开始后追加到数组里的元素们不会被 callbackfn 访问。如果更改以存在数组元素,filter 访问这些元素时的值会传给 callbackfn;在 filter 调用开始后删除的和之前被访问过的元素们是不访问的。

 当以一个或两个参数调用 filter 方法,采用以下步骤:

  1. 令 O 为 以 this 值作为参数调用 ToObject 的结果 .
  2. 令 lenValue 为 以 "length" 作为参数调用 O 的 [[Get]] 内部方法的结果 .
  3. 令 len 为 ToUint32(lenValue).
  4. 如果 IsCallable(callbackfn) 是 false, 抛出一个 TypeError 异常 .
  5. 如果提供了 thisArg, 令 T 为 thisArg; 否则令 T 为 undefined.
  6. 令 A 为 仿佛用 new Array( len) 创建的新数组,这里的 Array 是标准内置构造器名,len 是 len 的值。
  7. 令 k 为 0.
  8. 令 to 为 0.
  9. 只要 k < len ,就重复
    1. 令 Pk 为 ToString(k).
    2. 令 kPresent 为 以 Pk 作为参数调用 O 的 [[HasProperty]] 内部方法的结果 .
    3. 如果 kPresent 是 true, 则
      1. 令 kValue 为 以 Pk 作为参数调用 O 的 [[Get]] 内部方法的结果 .
      2. 令 selected 为 以 T 作为 this 值以包含 kValue, k, 和 O 的参数列表调用 callbackfn 的 [[Call]] 内部方法的结果 .
      3. 如果 ToBoolean(selected) 是 true, 则
        1. 以 ToString(to), 属性描述符 {[[Value]]: kValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, 和 false 作为参数调用 A 的 [[DefineOwnProperty]] 内部方法 .
        2. to 递增 1.
    4. k 递增 1.
  10. 返回 A.

 filter 方法的 length 属性是 1。

filter 函数被有意设计成通用的;它的 this 值并非必须是数组对象。因此,它可以作为方法转移到其他类型的对象中。一个宿主对象是否可以正确应用这个 filter 函数是依赖于实现的。

在console窗口验证以下三段代码:

var arr=[1,23,5,78,34,55,13];arr.filter(function(element,pos){return element>23});
var arr = ["张三", "李四", "王五", "阿三","张学友"];function whatDoesItDo(arr){     return arr.filter(function(elem, pos) {    return arr.indexOf(elem) == pos;});};whatDoesItDo(arr);
var arr = ["张三", "李四", "王五", "阿三","张学友"];key = "";            arr.filter(function(element,pos){                return element.indexOf(key) > -1;            });

基本用法就是这样子了,带2个参数,第一位是返回的那个数组,第二位是返回的索引(可省略)。

不一定要用elem或者element,可以随意定参数名称。

filter