概述
filter() 方法使用指定的函數(shù)測試所有元素,并創(chuàng)建一個包含所有通過測試的元素的新數(shù)組弊仪。
語法
var new_arrary = arr.filter(callback[, thisArg])
參數(shù)
callback
用來測試數(shù)組的每個元素的函數(shù)财异。調(diào)用時使用參數(shù) (element, index, array)朵你。
返回true表示保留該元素(通過測試),false則不保留。
thisArg
可選搞旭。執(zhí)行 callback 時的用于 this 的值榕莺。
描述
filter 為數(shù)組中的每個元素調(diào)用一次 callback 函數(shù),并利用所有使得 callback 返回 true 或 等價于 true 的值 的元素創(chuàng)建一個新數(shù)組晒屎。callback 只會在已經(jīng)賦值的索引上被調(diào)用喘蟆,對于那些已經(jīng)被刪除或者從未被賦值的索引不會被調(diào)用。那些沒有通過 callback 測試的元素會被跳過鼓鲁,不會被包含在新數(shù)組中蕴轨。
callback 被調(diào)用時傳入三個參數(shù):
- 元素的值
- 元素的索引
- 被遍歷的數(shù)組
如果為 filter 提供一個 thisArg 參數(shù),則它會被作為 callback 被調(diào)用時的 this 值骇吭。否則橙弱,callback 的 this 值在非嚴(yán)格模式下將是全局對象,嚴(yán)格模式下為 undefined燥狰。
The thisvalue ultimately observable by callback is determined according to the usual rules for determining thethis seen by a function.
filter 不會改變原數(shù)組棘脐。
filter 遍歷的元素范圍在第一次調(diào)用 callback 之前就已經(jīng)確定了。在調(diào)用 filter 之后被添加到數(shù)組中的元素不會被 filter 遍歷到龙致。如果已經(jīng)存在的元素被改變了蛀缝,則他們傳入 callback 的值是 filter 遍歷到它們那一刻的值。被刪除或從來未被賦值的元素不會被遍歷到目代。
示例
例子:篩選排除掉所有的小值
下例使用 filter 創(chuàng)建了一個新數(shù)組屈梁,該數(shù)組的元素由原數(shù)組中值大于 10 的元素組成。
function isBigEnough(element) {
return element >= 10;
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
// filtered is [12, 130, 44]
兼容舊環(huán)境(Polyfill)
filter 被添加到 ECMA-262 標(biāo)準(zhǔn)第 5 版中榛了,因此在某些實現(xiàn)環(huán)境中不被支持在讶。可以把下面的代碼插入到腳本的開頭來解決此問題忽冻,該代碼允許在那些沒有原生支持 filter 的實現(xiàn)環(huán)境中使用它真朗。該算法是 ECMA-262 第 5 版中指定的算法,假定 fn.call 等價于 Function.prototype.call 的初始值僧诚,且 Array.prototype.push 擁有它的初始值遮婶。
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];
// NOTE: Technically this should Object.defineProperty at
// the next index, as push can be affected by
// properties on Object.prototype and Array.prototype.
// But that method's new, and collisions should be
// rare, so use the more-compatible alternative.
if (fun.call(thisArg, val, i, t))
res.push(val);
}
}
return res;
};
}
參考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/filter