filter
2023年06月19日
一、认识
Array.prototype.filter()
方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
二、语法
var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])
- callback: 数组中当前正在处理的元素。
- element: 数组中当前正在处理的元素。
- index可选: 正在处理的元素在数组中的索引。
- array可选: 调用了 filter 的数组本身。
- thisArg可选: 执行 callback 时,用于 this 的值。
三、返回值
一个新的、由通过测试的元素组成的数组,如果没有任何数组元素通过测试,则返回空数组。
四、应用场景
4.1 过滤 false 元素
const list = [false, '', 0, 2, 3, null, undefined];
console.log(list.filter(Boolean)); // [2,3]
等价于
const list = [false, '', 0, 2, 3, null, undefined];
console.log(list.filter(item => Boolean(item))); // [2,3]
4.2 筛选所有小于10的元素
var array = [1,2,3,4,5,6,7,8,9,10,11,12];
var arrayCopy = array.filter(function(value,index,array){
return value < 10;
});
console.log(arrayCopy); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
五、原理(Polyfill)
Array.prototype.filter = function(callback,thisArg){
if(this == null){
throw new TypeError('this is null or not defined');
}
if(typeof callback !== 'function'){
throw new TypeError('callback is not function');
}
var object = Object(this);
var length = object.length >>> 0;
var result = new Array(length);
var objectIndex = 0;
var resultIndex = 0;
while(objectIndex < length){
if(objectIndex in object){
var value = object[objectIndex];
var res = callback.call(thisArg,value,objectIndex,object);
if(res){
result[resultIndex++] = value;
}
}
objectIndex++;
}
result.length = resultIndex;
return result;
}
var array = [1,2,3,4,5,6,7,8,9,10,11,12];
var arrayCopy = array.filter(function(value,index,array){
return value < 10;
});
console.log(arrayCopy); // [1, 2, 3, 4, 5, 6, 7, 8, 9]