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 相关文章推荐
Add Formatted Text to a Word Document
Jun 15 Javascript
Web 前端设计模式--Dom重构 提高显示性能
Oct 22 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
May 19 Javascript
如何用javascript计算文本框还能输入多少个字符
Jul 29 Javascript
有关jQuery中parent()和siblings()的小问题
Jun 01 Javascript
微信小程序 video详解及简单实例
Jan 16 Javascript
快速掌握jQuery插件开发
Jan 19 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
Mar 21 jQuery
浅谈vue-router2路由参数注意的问题
Nov 08 Javascript
Angular4 Select选择改变事件的方法
Oct 09 Javascript
JavaScript实现简单音乐播放器
Apr 17 Javascript
从0到1搭建element后台框架优化篇(打包优化)
May 12 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
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
谷歌音乐搜索栏的提示功能php修正代码
2011/05/09 PHP
基于PHP Web开发MVC框架的Smarty使用说明
2013/04/19 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
2016/11/03 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
微信小程序实现移动端滑动分页效果(ajax)
2017/06/13 Javascript
Swiper实现轮播图效果
2017/07/03 Javascript
详解react服务端渲染(同构)的方法
2017/09/21 Javascript
canvas绘制爱心的几种方法总结(推荐)
2017/10/31 Javascript
微信小程序动态增加按钮组件
2018/09/14 Javascript
微信小程序API—获取定位的详解
2019/04/30 Javascript
jQuery实现html可联动的百分比进度条
2020/03/26 jQuery
小程序表单认证布局及验证详解
2020/06/19 Javascript
使用PYTHON创建XML文档
2012/03/01 Python
Python列表list数组array用法实例解析
2014/10/28 Python
Python中DJANGO简单测试实例
2015/05/11 Python
python对象及面向对象技术详解
2016/07/19 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
2018/05/16 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
Python基础学习之时间转换函数用法详解
2019/06/18 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
Pytorch 高效使用GPU的操作
2020/06/27 Python
HTML5时代CSS设置漂亮字体取代图片
2014/09/04 HTML / CSS
雅诗兰黛澳大利亚官网:Estée Lauder澳大利亚
2019/05/31 全球购物
大学旷课检讨书
2014/01/28 职场文书
西北政法大学自主招生自荐信
2014/01/29 职场文书
2014年五一促销活动方案
2014/03/09 职场文书
爱国演讲稿500字
2014/05/04 职场文书
2014年女职工工作总结
2014/11/27 职场文书
工作证明书
2015/06/15 职场文书
反四风问题学习心得体会
2016/01/22 职场文书