详解 js filter 的使用方法

filter 
它用于把Array的某些元素过滤掉,然后返回剩下的元素。

和map()类似,Array的filter()也接收一个函数。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素。

例如,在一个Array中,删掉偶数,只保留奇数,可以这么写

var arr = [1, 2, 4, 5, 6, 9, 10, 15];
var r = arr.filter(function (x) {
    return x % 2 !== 0;
});
r; // [1, 5, 9, 15]

把一个Array中的空字符串删掉,可以这么写:

var arr = ['A', '', 'B', null, undefined, 'C', '  '];
var r = arr.filter(function (s) {
    return s && s.trim(); // 注意:IE9以下的版本没有trim()方法
});
arr; // ['A', 'B', 'C']

trim()函数去掉字符串首尾空白字符

回调函数

filter()接收的回调函数,其实可以有多个参数。通常我们仅使用第一个参数,表示Array的某个元素。回调函数还可以接收另外两个参数,表示元素的位置数组本身

var arr = ['A', 'B', 'C'];
var r = arr.filter(function (element, index, self) {
    console.log(element); // 依次打印'A', 'B', 'C'
    console.log(index); // 依次打印0, 1, 2
    console.log(self); // self就是变量arr
    return true;
});

利用filter,可以巧妙地去除Array的重复元素:

'use strict';
 
var
    r,
    arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry'];
 
    r = arr.filter(function (element, index, self) {
    return self.indexOf(element) === index;
});
 
alert(r.toString());

indexOf总是返回第一个元素的位置,后续的重复元素位置与indexOf返回的位置不相等,因此被filter滤掉了,所以重复的元素仅会保留第一个位置的元素

练习

请尝试用filter()筛选出素数:

'use strict';
 
function get_primes(arr) {
var s = arr.filter(function(x){
   if(x<4)return x!=1;
   var i=2;
   for(;i<=x/2;++i)
   if(x%i==0)return false;
   return true;
});
return s;
}
 
// 测试:
var
    x,
    r,
    arr = [];
for (x = 1; x < 100; x++) {
    arr.push(x);
}
r = get_primes(arr);
if (r.toString() === [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97].toString()) {
    alert('测试通过!');
} else {
    alert('测试失败: ' + r.toString());
}

### JavaScript 中 `filter` 方法用法 `filter()` 是一种用于数组操作的强大工具,它会创建一个新的数组,其中包含所有通过测试条件的元素。此方法不会修改原始数组,而是返回一个由满足条件的元素组成的新数组。 以下是有关 `filter()` 的一些关键点: - 它接收一个回调函数作为参数,该回调函数会对数组中的每个元素执行一次。 - 如果回调函数对于某个元素返回 `true`,则该元素会被加入到新的数组中;如果返回 `false` 或其他假值,则忽略该元素。 - 返回的结果是一个新数组,可能为空或者长度小于等于原数组。 下面是一些具体的例子来展示其功能: #### 基本语法 ```javascript const filteredArray = array.filter(callback(element[, index[, array]])[, thisArg]); ``` - **element**: 当前正在处理的数组元素。 - **index** *(可选)*: 元素索引。 - **array** *(可选)*: 调用了 `filter` 的源数组本身。 - **thisArg** *(可选)*: 执行 callback 时使用的 `this` 值。 #### 示例代码 ##### 过滤偶数 假设有一个整数数组,我们希望筛选出所有的偶数: ```javascript const numbers = [1, 2, 3, 4, 5]; const evenNumbers = numbers.filter(function(num) { return num % 2 === 0; }); console.log(evenNumbers); // 输出: [2, 4] ``` ##### 使用箭头函数简化写法 利用 ES6 箭头函数可以进一步缩短代码: ```javascript const numbers = [1, 2, 3, 4, 5]; const oddNumbers = numbers.filter(num => num % 2 !== 0); console.log(oddNumbers); // 输出: [1, 3, 5] ``` ##### 结合对象属性过滤数据 如果有多个带有特定键的对象组成的数组,可以通过某些条件对其进行筛选: ```javascript const users = [ { name: 'Alice', age: 25 }, { name: 'Bob', age: 18 }, { name: 'Charlie', age: 30 } ]; // 只保留年龄大于20岁的用户 const adults = users.filter(user => user.age > 20); console.log(adults); /* 输出: [ { name: 'Alice', age: 25 }, { name: 'Charlie', age: 30 } ] */ ``` 上述实现展示了如何灵活运用 `filter()` 来完成各种复杂的逻辑判断[^1]。 ### 注意事项 尽管 `filter()` 提供了一种简洁的方式来构建子集集合,但它并不适合用来改变现有结构或终止迭代过程——这些需求更适合使用诸如 `map()` 和自定义遍历器模式解决[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值