数组过滤器方法是 JavaScript 中使用最广泛的方法之一。

它允许我们快速过滤出具有特定条件的数组中的元素。

因此,在本文中,您将了解有关过滤器方法及其各种用例的所有内容。

所以让我们开始吧。


看看下面没有使用过滤器方法的代码:

复制
const employees = [{ name: 'David Carlson', age: 30 },{ name: 'John Cena', age: 34 },{ name: 'Mike Sheridan', age: 25 },{ name: 'John Carte', age: 50 }
];const filtered = [];for(let i = 0; i < employees.length; i++) {if(employees[i].name.indexOf('John') > -1) {filtered.push(employees[i]);}
}console.log(filtered); // [ { name: "John Cena", age: 34 }, { name: "John Carte", age: 50 }]

在上面的代码中,我们正在查找具有John我们正在使用indexOf方法的名称的所有员工。

for 循环代码看起来很复杂,因为我们需要手动循环employees数组并将匹配的员工推送到filtered数组中。

但是使用数组过滤方法,我们可以简化上面的代码。

数组过滤方法

数组过滤方法的语法如下:

复制
Array.filter(callback(element[, index[, array]])[, thisArg])

filter 方法不会更改原始数组,但会返回一个新数组,其中包含满足提供的测试条件的所有元素。

filter 方法将回调函数作为第一个参数,并为数组的每个元素执行回调函数。

在回调函数的每次迭代中,每个数组元素值都作为第一个参数传递给回调函数。

使用过滤器方法查看以下代码:

复制
const employees = [{ name: 'David Carlson', age: 30 },{ name: 'John Cena', age: 34 },{ name: 'Mike Sheridan', age: 25 },{ name: 'John Carte', age: 50 }
];const filtered = employees.filter(function (employee) {return employee.name.indexOf('John') > -1;
});console.log(filtered); // [ { name: "John Cena", age: 34 }, { name: "John Carte", age: 50 }]

在这里,使用数组过滤方法,我们不需要手动循环遍历employees数组,也不需要filtered事先创建数组来过滤掉匹配的员工。

了解过滤方法

filter 方法接受一个回调函数,数组的每个元素在循环的每次迭代中都作为第一个参数自动传递。

假设我们有以下数字数组:

复制
const numbers = [10, 40, 30, 25, 50, 70];

而我们想要找出所有大于30的元素,那么我们可以使用如下所示的过滤方法:

复制
const numbers = [10, 40, 30, 25, 50, 70];const filtered = numbers.filter(function(number) {return number > 30;
});console.log(filtered); // [40, 50, 70]

所以在回调函数内部,在循环的第一次迭代中,数组中的第一个元素值 10 将作为number参数值传递,并且 10 > 30 为 false,因此数字 10 不会被视为匹配项。

数组过滤方法返回一个数组,因此 10 不大于 30,它不会被添加到filtered数组列表中。

然后在循环的下一次迭代中,数组中的下一个元素 40 将作为number参数值传递给回调函数,当 40 > 30 为真时,将被视为匹配并添加到filtered大批。

这将一直持续到数组中的所有元素都没有完成循环。

因此,只要回调函数返回一个false值,该元素就不会被添加到过滤后的数组中。filter 方法返回一个数组,该数组仅包含回调函数为其返回true值的那些元素。

您可以看到在循环的每次迭代中传递给回调函数的元素的当前值如果将值记录到控制台:

复制
const numbers = [10, 40, 30, 25, 50, 70];const filtered = numbers.filter(function(number) {console.log(number, number > 30);return number > 30;
});console.log(filtered); // [40, 50, 70]/* output10 false
40 true
30 false
25 false
50 true
70 true[40, 50, 70]*/

现在,看看下面的代码:

复制
const checkedState = [true, false, false, true, true];const onlyTrueValues = checkedState.filter(function(value) {return value === true;
});console.log(onlyTrueValues); // [true, true, true]

在上面的代码中,我们只找出那些值为true.

回调函数可以如上所示编写,也可以使用箭头函数如下所示:

复制
const onlyTrueValues = checkedState.filter(value => {return value === true;
});

而如果箭头函数中只有一条语句,我们可以跳过return关键字,隐式返回值,如下图:

复制
const onlyTrueValues = checkedState.filter(value => value === true);

上面的代码可以进一步简化为:

复制
const onlyTrueValues = checkedState.filter(Boolean);

要了解它是如何工作的,请查看我的这篇文章。

回调函数参数

除了数组的实际元素外,传递给 filter 方法的回调函数还接​​收以下参数:

  • 我们正在循环的index数组中当前元素的
  • array我们循环播放的原版

看看下面的代码:

复制
const checkedState = [true, false, false, true, true];checkedState.filter(function(value, index, array) {console.log(value, index, array);return value === true;
});/* outputtrue   0  [true, false, false, true, true]
false  1  [true, false, false, true, true]
false  2  [true, false, false, true, true]
true   3  [true, false, false, true, true]
true   4  [true, false, false, true, true]*/

过滤方法的用例

正如您在上面看到的,数组过滤器方法对于过滤掉数组中的数据很有用。

但是过滤器方法在一些实际用例中也很有用,例如从数组中删除重复项,分离两个数组之间的公共元素等。

从数组中删除元素

filter 方法最常见的用例是从数组中删除特定元素。

复制
const users = [{name: 'David', age: 35},{name: 'Mike', age: 30},{name: 'John', age: 28},{name: 'Tim', age: 48}
];const userToRemove = 'John';const updatedUsers = users.filter(user => user.name !== userToRemove);console.log(updatedUsers);/* output[{name: 'David', age: 35},{name: 'Mike', age: 30},{name: 'Tim', age: 48}
]*/

在这里,我们从users名称为 的数组中删除用户John

userToRemove因此,在回调函数中,我们正在检查保留名称与存储在变量中的名称不匹配的用户的条件。

从数组中查找唯一或重复项

复制
const numbers = [10, 20, 10, 30, 10, 30, 50, 70];const unique = numbers.filter((value, index, array) => {return array.indexOf(value) === index;
})console.log(unique); // [10, 20, 30, 50, 70]const duplicates = numbers.filter((value, index, array) => {return array.indexOf(value) !== index;
})console.log(duplicates); // [10, 10, 30]

indexOf方法返回第一个匹配元素的索引,因此,在上面的代码中,我们正在检查我们正在循环的元素的当前索引是否与第一个匹配元素的索引匹配,以找出唯一和重复元素.

查找两个数组之间的不同值

复制
const products1 = ["books","shoes","t-shirt","mobile","jackets"];const products2 = ["t-shirt", "mobile"];const filteredProducts = products1.filter(product => products2.indexOf(product) === -1);console.log(filteredProducts); // ["books", "shoes", "jackets"]

在这里,我们products1使用 filter 方法循环,​​在回调函数中,我们正在检查products2数组是否包含我们使用 arrayindexOf方法循环的当前元素。

如果该元素不匹配,则条件为真,该元素将被添加到filteredProducts数组中。

您还可以使用数组includes方法来实现相同的功能:

复制
const products1 = ["books","shoes","t-shirt","mobile","jackets"];const products2 = ["t-shirt", "mobile"];const filteredProducts = products1.filter(product => !products2.includes(product));console.log(filteredProducts); // ["books", "shoes", "jackets"]

浏览器对过滤方法的支持

  • 所有现代浏览器和 Internet Explorer (IE) 版本 9 及更高版本
  • Microsoft Edge 版本 12 及更高版本

谢谢阅读!

JavaScript 数组filter方法完整介绍相关推荐

  1. 这是如何更好地利用JavaScript数组的方法

    by pacdiv 由pacdiv 这是如何更好地利用JavaScript数组的方法 (Here's how you can make better use of JavaScript arrays) ...

  2. 判断javascript数组的方法

    2019独角兽企业重金招聘Python工程师标准>>> 判断javascript数组的方法 var is_array=function(){ return value &&a ...

  3. JavaScript数组归并方法reduce

    示例代码: <!DOCTYPE html> <html lang="zh"><head><meta charset="UTF-8 ...

  4. python定义数组的方法_Python数组定义方法详细介绍

    本文实例讲述了Python数组定义方法.分享给大家供大家参考,具体如下: Python中没有数组的数据结构,但列表很像数组,如: a=[0,1,2] 这时:a[0]=0, a[1]=1, a[[2]= ...

  5. ES6 新增数组的方法使用介绍

    ES5中新增了写数组方法,如下: forEach (js v1.6) map (js v1.6) filter (js v1.6) some (js v1.6) every (js v1.6) ind ...

  6. splice方法_[7000字]JavaScript数组所有方法基础总结

    基础决定一个人的上限,很多时候我们感叹别人在实现一个功能时使用方法的精妙,并且反思,为什么别人想的出来自己却想不出来?我觉得主要是因为对于基础的掌握上有很大的差距.本文总结数组的所有方法的基础使用,希 ...

  7. JavaScript 数组遍历方法的对比

    前言 JavaScript 发展至今已经发展出多种数组的循环遍历的方法,不同的遍历方法运行起来那个比较快,不同循环方法使用在那些场景,下面将进行比较: 各种数组遍历的方法 for 语句 代码: var ...

  8. JavaScript 数组去重方法合集(简洁易懂)

    JavaScript数组去重 JavaScript去重的七种方法 简单易懂 方法一:暴力去重法 // 暴力去重法 function ArrayIsUnique (array) {if (!Array. ...

  9. ES6 必须要用的数组Filter() 方法,不要再自己循环遍历了!!!

    1,来一个最简单最常用的栗子: 获得年龄为9岁的孩子 1 let arr = [2 {3 name:'小明',4 sex:0,5 age:96 },7 { 8 name:'小红', 9 sex:1, ...

最新文章

  1. 中国人工智能学会通讯——智能语音技术与产业应用展望 1.2 智能语音产业应用的现状和挑战...
  2. String与StringBuffer 理解
  3. 【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )
  4. STM32F405的 ADC参考电压选择问题
  5. systemverilog硬件设计及建模_Chisel引领敏捷硬件开发浪潮
  6. 【数据库】oracle数据库----内嵌视图
  7. SAP Fiori gateway OData开发重要的tcode SEGW背后的数据库表
  8. Python自动化二--jmeter分布式测试,抓包,python语法基本介绍
  9. 美国下注15亿美元重点搞芯片!电子复兴5年计划首批入围项目曝光
  10. 梦幻群侠传5帮派修炼_梦幻封妖传5门派技能介绍 | 手游网游页游攻略大全
  11. 237.删除链表中的节点
  12. js获取网络时间(axios获取响应头时间)
  13. 【软考 系统架构设计师】软件工程⑥ 软件系统建模
  14. 支持向量机(一)你确定不看吗
  15. 网络工程师成长日记140-机遇都是碰出来的
  16. Vue中定制公共组件之modal
  17. 【深度长文】老IT公司怎么做到像创业公司一样快
  18. after::和before::的用法
  19. javaWeb中 servlet 、request 、response
  20. 学计算机近视度数加深,导致近视加深的八大原因

热门文章

  1. 如何增加文档的易读性
  2. 美团、点评、猫眼App下拉加载效果的源码分享
  3. html鼠标划到图片位置变大
  4. 字节否认140万刀挖OpenAI人才/ 淘宝1亿成立AI公司/ 推特遭GPT水军占领...今日更多新鲜事在此...
  5. Phylip进化树的使用,偏重于文件格式的获取
  6. javascript表单验证及正则表达式
  7. S2D 真实机房生产环境运维排错
  8. roscore : 出现:Traceback (most recent call last)
  9. 基于JAVA社区微服务平台小程序服务器端计算机毕业设计源码+系统+lw文档+部署
  10. 尚硅谷以太坊区块链学习(4)