在线文档教程

array.filter

array.filter

filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。

var words = ["spray", "limit", "elite", "exuberant", "destruction", "present"]; var longWords = words.filter(function(word){   return word.length > 6; } // Filtered array longWords is ["exuberant", "destruction", "present"]

ES6版本

var words = ["spray", "limit", "elite", "exuberant", "destruction", "present"]; var longWords = words.filter(word => word.length > 6 // Filtered array longWords is ["exuberant", "destruction", "present"]

语法

var newArray = arr.filter(callback[, thisArg])

参数

callback用来测试数组的每个元素的函数。返回true表示保留该元素(通过测试);false则不保留,取三个参数:

返回值

一个新的通过测试的元素的集合的数组。

描述

filter为数组中的每个元素调用一次 callback函数,并利用所有使得callback返回 true 或 等价于 true 的值 的元素创建一个新数组。callback 只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。那些没有通过 callback测试的元素会被跳过,不会被包含在新数组中。

callback被调用时传入三个参数:

  • 元素的值

  • 元素的索引

  • 被遍历的数组

如果为filter提供一个 thisArg 参数,则它会被作为callback被调用时的this值。否则,callbackthis值在非严格模式下将是全局对象,严格模式下为undefined

filter不会改变原数组。

filter 遍历的元素范围在第一次调用callback之前就已经确定了。在调用filter之后被添加到数组中的元素不会被filter遍历到。如果已经存在的元素被改变了,则他们传入callback的值是filter遍历到它们那一刻的值。被删除或从来未被赋值的元素不会被遍历到。

示例

筛选排除掉所有的小值

下例使用 filter 创建了一个新数组,该数组的元素由原数组中值大于 10 的元素组成。

function isBigEnough(value) { return value >= 10; } var filtered = [12, 5, 8, 130, 44].filter(isBigEnough // filtered is [12, 130, 44]

从JSON过滤无效条目

以下示例使用filter()创建具有非零数字id的所有元素的过滤json 。

var arr = [ { id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 12.2 }, { }, { id: null }, { id: NaN }, { id: 'undefined' } ]; var invalidEntries = 0; function isNumber(obj) { return obj!== undefined && typeof(obj) === 'number' && !isNaN(obj } function filterByID(item) { if (isNumber(item.id)) { return true; } invalidEntries++; return false; } var arrByID = arr.filter(filterByID console.log('Filtered Array\n', arrByID // Filtered Array // [{ id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 12.2 }] console.log('Number of Invalid Entries = ', invalidEntries // Number of Invalid Entries = 4

在数组中搜索

以下示例根据搜索条件使用filter()过滤数组内容

var fruits = ['apple', 'banana', 'grapes', 'mango', 'orange']; /** * Array filters items based on search criteria (query) */ function filterItems(query) { return fruits.filter(function(el) { return el.toLowerCase().indexOf(query.toLowerCase()) > -1; }) } console.log(filterItems('ap') // ['apple', 'grapes'] console.log(filterItems('an') // ['banana', 'mango', 'orange']

ES2015实施

const fruits = ['apple', 'banana', 'grapes', 'mango', 'orange']; /** * Array filters items based on search criteria (query) */ const filterItems = (query) => { return fruits.filter((el) => el.toLowerCase().indexOf(query.toLowerCase()) > -1 } console.log(filterItems('ap') // ['apple', 'grapes'] console.log(filterItems('an') // ['banana', 'mango', 'orange']

Polyfill

filter被添加到 ECMA-262 标准第 5 版中,因此在某些实现环境中不被支持。可以把下面的代码插入到脚本的开头来解决此问题,该代码允许在那些没有原生支持filter()的实现环境中使用它。该算法是 ECMA-262 第 5 版中指定的算法,假定 fn.call 等价于 Function.prototype.bind() 的初始值,且 Array.prototype.push() 拥有它的初始值。

if (!Array.prototype.filter) Array.prototype.filter = function(func, thisArg) { 'use strict'; if ( ! ((typeof func === 'Function' || typeof func === 'function') && this) )   throw new TypeError(   var len = this.length >>> 0, res = new Array(len), // preallocate array   t = this, c = 0, i = -1;   if (thisArg === undefined) while (++i !== len)   // checks to see if the key was set if (i in this) if (func(t[i], i, t)) res[c++] = t[i]; else       while (++i !== len)         // checks to see if the key was set         if (i in this)           if (func.call(thisArg, t[i], i, t))             res[c++] = t[i];     res.length = c; // shrink down array to proper size return res; };

规格

SpecificationStatusComment
ECMAScript 5.1 (ECMA-262)The definition of 'Array.prototype.filter' in that specification.StandardInitial definition. Implemented in JavaScript 1.6.
ECMAScript 2015 (6th Edition, ECMA-262)The definition of 'Array.prototype.filter' in that specification.Standard
ECMAScript Latest Draft (ECMA-262)The definition of 'Array.prototype.filter' in that specification.Living Standard

浏览器兼容性

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Basic Support(Yes)(Yes)1.59(Yes)(Yes)

FeatureAndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
Basic Support(Yes)(Yes)(Yes)1(Yes)(Yes)(Yes)