JavaScript进阶操作之过滤filter

简介: 引入我们在日常生活中,不难遇到一个非常耗时间的工作——筛选。比如,帮老师筛查出不及格的人数,帮老总筛选出上班考勤全满的人——掘金工作人员筛选出更文数量在30以上的创作者(不是)……人肉计数和筛查显然非常低效,而且很容易出错。计算机就是用来帮我们干这件事的。很多人估计第一反应回是用循环,遍历所有元素,满足条件提出来,不满足就下一个


引入


我们在日常生活中,不难遇到一个非常耗时间的工作——筛选。

比如,帮老师筛查出不及格的人数,帮老总筛选出上班考勤全满的人——掘金工作人员筛选出更文数量在30以上的创作者(不是)……

人肉计数和筛查显然非常低效,而且很容易出错。计算机就是用来帮我们干这件事的。很多人估计第一反应回是用循环,遍历所有元素,满足条件提出来,不满足就下一个

这个是没有问题的。但是我们程序员往往会把常用的功能封装起来,形成一个可以随时调用的工具——

这就是filter


1. filter使用机理


一般用filter来过滤array中的元素。当我们把filter作用于array的时候,他本身是一个array的方法(和对象绑定的函数)。

我们需要传入的参数是一个函数,filter之后会把我们传入的函数依次对每个array中的元素作用一遍,当获得返回值是True的时候保留该元素,False的时候则丢弃该元素。最后返回一个过滤后的值,而不对原来的对象array进行修改

从机理我们可以看出,filter中需要传入的函数需要能返回布尔值。并且我们需要把过滤后的值赋给一个变量,或者直接输出出来,否则无法拿到这个结果,因为filter不改变原array。


2. filter实用案例


最经典的案例就是奇偶数过滤了:

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

我们定义了一个array,进行filter之后希望输出奇数,那么我们就设计一个函数,函数内部进行x % 2 !== 0的判断,不等于0的时候返回True,则保留,等于0的时候即为偶数,返回False,丢弃。把结果赋值给r之后输出r即可。

还有一个实用的效果是,把传入的空字符串过滤掉:

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

trim方法是用于移除字符串左右的空格


3. filter的回调函数


filter方法中支持回调函数。其中主要有三个参数可以使用,一是element,二是index,三是self。

element表示原数组的某个元素

index表示元素位置

self表示数组本身

我们可以将它们依次输出看看效果

var test1 = ['1', '2', '3'];
var r = test1.filter(function (element, index, self) {
    console.log(element); // 输出'1', '2', '3'
    console.log(index); // 输出0, 1, 2
    console.log(self); // self就是变量test1这个数组
    return true;
});

这样在日志输出中我们会看到上面的效果。array的各项参数就被提取出来了。

那么这个有什么用呢?、

我们可以利用这个来去重。去除重复元素,有经验的小伙伴应该知道,我们可以放进集合,可以循环并判断……这个filter方法可以拓宽一下大家的知识面,也相当于增加一种理解。

var r;
var test1 = ['a','b','a','c','b','c','d','e'];
r = test1.filter(function (element, index, self) {
    return self.indexOf(element) === index;
});

indexOf函数返回的是第一个元素的位置,而element则用于回调所有元素来供给判断。当第一个元素的index和当前元素的index一样的时候,说明当前元素之前没有出现,于是返回True,被filter保留下来,反之则被过滤掉。


image.png

image.png

输出成功。

相关文章
|
16小时前
|
JavaScript 前端开发 索引
JavaScript编码之路 【JavaScript之操作数组、字符串方法汇总】(三)
JavaScript编码之路 【JavaScript之操作数组、字符串方法汇总】(三)
8 1
|
16小时前
|
JavaScript 前端开发 索引
JavaScript编码之路 【JavaScript之操作数组、字符串方法汇总】(一)
JavaScript编码之路 【JavaScript之操作数组、字符串方法汇总】(一)
5 0
|
16小时前
|
存储 JavaScript 前端开发
JavaScript编码之路 【JavaScript之操作数组、字符串方法汇总】(二)
JavaScript编码之路 【JavaScript之操作数组、字符串方法汇总】(二)
6 0
|
18小时前
|
存储 JavaScript 前端开发
js/javascript 操作字符串【全】(含常用的操作字符串的lodash)
js/javascript 操作字符串【全】(含常用的操作字符串的lodash)
5 1
|
18小时前
|
JavaScript 前端开发
js/javascript 操作对象【全】(含常用的操作对象的lodash)
js/javascript 操作对象【全】(含常用的操作对象的lodash)
4 0
|
18小时前
|
存储 JavaScript 前端开发
js/javascript 操作数组【全】(含常用的操作数组的lodash)
js/javascript 操作数组【全】(含常用的操作数组的lodash)
3 0
|
1天前
|
JavaScript
js 解析和操作树 —— 获取树的深度、提取并统计树的所有的节点和叶子节点、添加节点、修改节点、删除节点
js 解析和操作树 —— 获取树的深度、提取并统计树的所有的节点和叶子节点、添加节点、修改节点、删除节点
6 0
|
1天前
|
JavaScript 前端开发
js/javascript 操作时间日期【全】含时间日期的创建、获取、比较、计算、格式化、时间戳、昨天、今天、星期汉化、计时、相关插件等
js/javascript 操作时间日期【全】含时间日期的创建、获取、比较、计算、格式化、时间戳、昨天、今天、星期汉化、计时、相关插件等
8 0
|
1天前
|
设计模式 前端开发 JavaScript
JavaScript进阶 - JavaScript设计模式
【7月更文挑战第1天】JavaScript设计模式增进代码复用和维护性。单例模式确保唯一实例,用闭包防止命名冲突和控制状态访问。观察者模式实现一对多依赖,通过解绑避免内存泄漏。工厂模式封装对象创建,适度使用避免复杂度。装饰者模式动态添加行为,保持简洁以保可读性。理解模式的优缺点,灵活应用,提升代码质量。
|
4天前
|
JavaScript vr&ar 数据库
技术笔记:Js获取当前日期时间及其它操作
技术笔记:Js获取当前日期时间及其它操作
10 1