Array数组对象中的forEach、map、filter及reduce详析


Posted in Javascript onAugust 02, 2018

前言

刚才某人问了我一个问题。map怎么遍历,我刷刷刷就是一顿写。遍历么,forEach么,妥妥的。

var map = new Map();
map.set('item1', 'value1')
map.set('item2', 'value2')
map.forEach(function(value, key, map) {
 console.log("Key: %s, Value: %s", key, value);
});

好吧,我写完了之后,他发给我了一句话。 [].forEach()改成[].map()怎么用?

what?我这个暴脾气。。。。我当然是详细的说一下Array的常规遍历方法以及场景了。

Array.filter

语法

var new_arr = arr.filter(callback(element, index, array){

}, this)

参数

callback 回调
    element 当前的value
    index   当前的索引值
    array   arr这个数组对象
this 回调的this指向

返回值

Array 类型
//符合条件的值组成的数组

用法

//如果返回值是true的话,就是符合条件。
//filter 不会改变原数组,它返回过滤后的新数组。
//这个里返回数组里面的偶数
[10,11,12,13].filter((v)=>v % 2 == 0)
//只要审核通过的。当然正常情况下,对象比这个复杂一些。
[{state:1},{state:0},{state:0},{state:0}].filter((v)=>v.state == 1)
//只要成年人,记录是有效的
[{age:18,state:1},{age:16,state:0},{age:21,state:0}].filter((v)=>v.state == 1 && v.age > 17)

场景

场景就是过滤,把符合条件的整理到一起,常见的就是展示审核通过的数据,只显示关注我的人,只显示妹子,对吧糙汉子就过滤不看了。

Array.forEach

语法

arr.forEach(callback(element, index, array){

}, this)

参数

callback 回调
    element 当前的value
    index   当前的索引值
    array   arr这个数组对象
this 回调的this指向

返回值

undefined
// 这个东西没有返回值

用法

//遍历数组。打印到控制台
[10,11,12,13].forEach((v)=>{
 console.log(v)
})
// 成功的收集到success里面,错误的收集到error里面。
var success = [],error = [];
[{state:1},{state:0},{state:0},{state:0}].forEach((v)=>{
 if(v.state == 1){
  success.push(v)
 }else{
  error.push(v)
 }
})
// 给20岁的小姐姐打招呼
[{state:1,age: 1},{state:0,age: 20},{state:0,age: 19},{state:0,age: 31}].forEach((v)=>{
 if(v.age == 20){
  console.log('你好啊,我今年正好80')
 }
})

场景

比如说绑定事件,比如判断值然后push到不同的地方

Array.map

语法

arr.map(callback(element, index, array){

}, this)

参数

callback 回调
    element 当前的value
    index   当前的索引值
    array   arr这个数组对象
this 回调的this指向

返回值

array 数组
// 每个回调的返回值组成的新数组

用法

//把数值格式化,保留两位小数
[10.055,11.054,12.056,13.789].map((v)=>+v.toFixed(2))

场景

这个一般就用在,我需要一组值,但是这个值不对,需要计算原数组来生成。

Array.reduce

语法

arr.reduce(callback(accumulator, element, index, array){

}, initialValue)

参数

callback 回调
    sum     累加器的返回值,也就是上一次回调的返回值
    element 当前的value
    index   当前的索引值
    array   arr这个数组对象
initialValue 初始传入的值,如果不传回调从下标1开始,下标0作为初始值

返回值

//返回最后一次回调的值

用法

//累加
[10,11,12,13].reduce((s,v)=>s+v,0)

场景

这个计算整个数组得出一个值的

对比

  • forEach没有返回值,重点是function里面处理逻辑
  • map有返回值,重点是function返回值,组成新数组
  • filter有返回值,重点是function返回值,过滤之后组成新数组
  • reduce有返回值,重点是计算数组,返回一个值

昨天晚上下班着急跑路,还差一些例子没往上整理,今天补上

例子

大家可以尝试写写,有好的例子能更好的说明函数的作用也可以在评论区提出来,有好的解决方案也可以写出来。

有一组用户信息按手机号降序排序,输出用户名称,用逗号分隔

[{name: 'l1', phone: '1507539'},{name: 'l2', phone: '1507540'},{name: 'l3', phone: '1507541'},{name: 'l4', phone: '1507538'}]
 .sort((n,m)=>n.phone<m.phone)
 .map(m=>m.name)
 .join(',')

给元素绑事件

[].slice.call(document.querySelectorAll('div'))
 .forEach(v=>v.addEventListener('click',e=>console.log(e.target.className)))

获取所有元素的class,过滤空串

[].slice.call(document.querySelectorAll('*'))
 .map(v=>v.className)
 .filter(v=>v)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
测试JavaScript字符串处理性能的代码
Dec 07 Javascript
JS 两个字符串时间的天数差计算
Aug 25 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
Jul 31 Javascript
jQuery中width()方法用法实例
Dec 24 Javascript
JS实现图片产生波纹一样flash效果的方法
Feb 27 Javascript
javascript实现控制浏览器全屏
Mar 30 Javascript
Bootstrap布局组件应用实例讲解
Feb 17 Javascript
Vue.js 单页面多路由区域操作的实例详解
Jul 17 Javascript
Javascript es7中比较实用的两个方法示例
Jul 21 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
May 13 Javascript
Angular之jwt令牌身份验证的实现
Feb 14 Javascript
vue项目接口域名动态获取操作
Aug 13 Javascript
利用Blob进行文件上传的完整步骤
Aug 02 #Javascript
vue.js图片转Base64上传图片并预览的实现方法
Aug 02 #Javascript
vue组件横向树实现代码
Aug 02 #Javascript
利用Node.js批量抓取高清妹子图片实例教程
Aug 02 #Javascript
在微信小程序里使用watch和computed的方法
Aug 02 #Javascript
在小程序中使用Echart图表的示例代码
Aug 02 #Javascript
node.js读取Excel数据(下载图片)的方法示例
Aug 02 #Javascript
You might like
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
教你IIS6的PHP最佳配置方法
2006/09/05 PHP
小偷PHP+Html+缓存
2006/11/25 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
2013/06/21 PHP
php 在windows下配置虚拟目录的方法介绍
2013/06/26 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
2013/08/01 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
yii实现model添加默认值的方法(2种方法)
2016/01/06 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
Javascript注入技巧
2007/06/22 Javascript
js中判断控件是否存在
2010/08/25 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
Javascript图像处理思路及实现代码
2012/12/25 Javascript
如何使用jquery动态加载js,css文件实现代码
2013/04/03 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
jQuery实现手机版页面翻页效果的简单实例
2016/10/05 Javascript
JS常用函数和常用技巧小结
2016/10/15 Javascript
easyui form validate总是返回false的原因及解决方法
2016/11/07 Javascript
js实现带进度条提示的多视频上传功能
2020/12/13 Javascript
实战node静态文件服务器的示例代码
2018/03/08 Javascript
JQuery元素快速查找与操作
2018/04/22 jQuery
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
[01:54]TI珍贵瞬间系列(五):压力
2020/08/29 DOTA
python 算法 排序实现快速排序
2012/06/05 Python
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
Python使用requests发送POST请求实例代码
2018/01/25 Python
python学生管理系统代码实现
2020/04/05 Python
Python smtplib实现发送邮件功能
2018/05/22 Python
python 的topk算法实例
2020/04/02 Python
浅谈pymysql查询语句中带有in时传递参数的问题
2020/06/05 Python
违纪检讨书2000字
2014/02/08 职场文书
初中班主任评语
2014/04/24 职场文书
nginx部署多前端项目的几种方法
2021/05/25 Servers
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript