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
值。否则,callback
的this
值在非严格模式下将是全局对象,严格模式下为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;
};
规格
Specification | Status | Comment |
---|---|---|
ECMAScript 5.1 (ECMA-262)The definition of 'Array.prototype.filter' in that specification. | Standard | Initial 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 | |
浏览器兼容性
Feature | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic Support | (Yes) | (Yes) | 1.5 | 9 | (Yes) | (Yes) |
Feature | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
Basic Support | (Yes) | (Yes) | (Yes) | 1 | (Yes) | (Yes) | (Yes) |