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

输出成功。

相关文章
|
3月前
|
JavaScript 前端开发
JavaScript 中 五种迭代数组的方法 every some map filter forEach
本文介绍了JavaScript中五种常用数组迭代方法:every、some、filter、map和forEach,并通过示例代码展示了它们的基本用法和区别。
|
4月前
|
JavaScript 前端开发 索引
JS中常用的数组迭代方法(filter,forEach,map,every,some,find,findIndex)
这段代码和说明介绍了JavaScript中数组的一些常用方法。函数接收三个参数:`item`(数组项的值)、`index`(项的位置,可选)和`array`(数组本身,可选)。示例展示了如何使用`filter()`过滤非空项、`forEach()`遍历数组、`map()`处理并返回新数组、`every()`检查所有元素是否满足条件、`some()`检查是否存在满足条件的元素、`find()`获取首个符合条件的元素值以及`findIndex()`获取其索引位置。这些方法都不会修改原数组。
JS中常用的数组迭代方法(filter,forEach,map,every,some,find,findIndex)
|
5月前
|
XML 前端开发 JavaScript
JavaScript进阶 - AJAX请求与Fetch API
【7月更文挑战第3天】前端开发中的异步基石:AJAX与Fetch。AJAX,使用XMLHttpRequest,处理跨域、回调地狱和错误处理。Fetch,基于Promise,简化请求,但需注意默认无跨域头和HTTP错误处理。两者各有优劣,理解其问题与解决策略,能提升前端应用的性能和用户体验。
151 24
|
5月前
|
前端开发 JavaScript 安全
JavaScript进阶-JavaScript库与框架简介
【7月更文挑战第11天】JavaScript库和框架加速Web开发,但也带来挑战。选择适合项目、团队技能的库或框架,如React、Angular、Vue,是关键。保持依赖更新,注意性能优化,避免过度依赖。遵循最佳实践,确保安全性,如防XSS和CSRF。学习基础,结合代码示例(如React计数器组件),提升开发效率和应用质量。
61 1
|
5月前
|
缓存 JavaScript 前端开发
JavaScript进阶 - Web Workers与Service Worker
【7月更文挑战第4天】JavaScript的Web Workers和Service Worker增强了Web性能。Web Workers处理后台多线程,减轻主线程负担,但通信有开销,受同源策略限制。Service Worker则用于离线缓存和推送通知,需管理其生命周期、更新策略,并确保安全。两者都带来了挑战,但也极大提升了用户体验。通过理解和优化,开发者能构建更高效、安全的Web应用。
130 2
|
5月前
|
资源调度 JavaScript 前端开发
JavaScript进阶 - JavaScript库与框架简介
【7月更文挑战第5天】JavaScript库和框架构成了前端开发的核心,如jQuery简化DOM操作,Angular、React和Vue提供全面解决方案。选择时要明确需求,避免过度工程化和陡峭学习曲线。使用版本管理工具确保兼容性,持续学习以适应技术变化。示例展示了jQuery和React的简单应用。正确选择和使用这些工具,能提升开发效率并创造优秀Web应用。
49 2
|
5月前
|
JavaScript API
js【最佳实践】遍历数组的八种方法(含数组遍历 API 的对比)for,forEach,for of,map,filter,reduce,every,some
js【最佳实践】遍历数组的八种方法(含数组遍历 API 的对比)for,forEach,for of,map,filter,reduce,every,some
81 1
|
5月前
|
存储 前端开发 安全
JavaScript进阶 - 浏览器存储:localStorage, sessionStorage, cookies
【7月更文挑战第2天】探索Web存储:localStorage持久化,sessionStorage会话限定,cookies则伴随HTTP请求。了解它们的特性和限制,如localStorage的5MB容量限制、跨域问题,sessionStorage的生命周期,及cookies的安全与带宽消耗。使用时需权衡安全、效率与应用场景。示例代码展示存储与检索方法。
303 2
|
5月前
|
JavaScript 前端开发 索引
JavaScript编码之路 【JavaScript之操作数组、字符串方法汇总】(三)
JavaScript编码之路 【JavaScript之操作数组、字符串方法汇总】(三)
44 1
|
5月前
|
存储 JavaScript 前端开发
js/javascript 操作字符串【全】(含常用的操作字符串的lodash)
js/javascript 操作字符串【全】(含常用的操作字符串的lodash)
46 1