前言:

​ 今天我想分享一个有关于循环筛选的知识点,也许是前端小白的你首先想到的是用for循环做筛选,但我这种小菜鸟想到的就是map(工作中很喜欢用= =),学过数据结构的小伙伴也肯定知道,线性表这些跟循环也息息相关,包括你出去面试的时候或许你遇到过这样的问题,map和forEach的区别?去重的几种方式?说实话,forEach我真的很少用,但不满足于现状的我,觉得应该多学习几种。我是前端挖坑妹,准备好了么?一起粗发~

正文:

​ 在代码示例中我会用到es6中的语言,如果你还不是很了解,你可以看看阮老师的es6.(= =我也是一点一点跟着看的。)

1.map

​ 先说一下最常用的map.利用map方便获得对象数组中的特定属性值们.它返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。

//将a02品牌的标价全部加100
const clothesArr=[{username:"sunan",haveA02:false,basePrice:30},{username:"fenshuajiang",haveA02:true,basePrice:10},{username:"huixin",haveA02:true,basePrice:20}
]//苏南的专栏 交流:912594095、公众号:honeyBadger8clothesArr.map(item=>item.haveA02?{...item,basePrice:item.basePrice+100}:item
)
  • map() 不会对空数组进行检测。
  • map() 不会改变原始数组。
2.filter

​ filter和map相比,它也接受一个函数,并把接受的函数依次作用于每个元素,返回值为true和false,true留下,false扔掉!看看例子~

const filterArr = [1,2,3,4,5,6,7,8,9,10];//这里我只想要3的倍数const newArr = filterArr.filter((x) => x % 3 == 0);console.log(newArr);//(3) [3, 6, 9]

这里需要注意:

  • filter() 不会对空数组进行检测。
  • filter() 不会改变原始数组,所以你需要赋值到新数组上。
3.forEach

forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。forEach方法中的function回调有三个参数:第一个参数是遍历的数组内容,第二个参数是对应的数组索引,第三个参数是数组本身,数组中有几项,那么传递进去的匿名回调函数就需要执行几次.

const forEachArr=[1,2,3,4,5];//计算所有数组的和
var sum=0;
forEachArr.forEach((value,index,array)=>{sum+=value;  });//苏南的专栏 交流:912594095、公众号:honeyBadger8
console.log(sum);//15

这里需要注意:

  • forEach() 对于空数组是不会执行回调函数的。
4.for in

以前觉得这个不常用,但现在真的很感谢有这个函数,因为最近项目中解决了很多问题,尤其是对象拿value值的时候,先来说说对数组的时候怎么用。

const forInArr=[1,2,3,4,5]
for(let index in forInArr){console.log(index,forInArr[index]);
}
//0 1
//1 2
//2 3
//3 4
//4 5

用for in不仅可以对数组便利,也可以对enumerable(可枚举)对象操作

const forInObj={'111':{name:'huixin',size:'m'},'222':{name:'sunan',size:'l'},'333':{name:'fenshuajiang',size:'s'}
};//这个时候我只想取到value值传给后端,key值不要。
for(let index in forInObj){console.log(index,forInObj[index]);
}
//111 {name: "huixin", size: "m"}
//222 {name: "sunan", size: "l"}
//333 {name: "fenshuajiang", size: "s"}

在这里插播一个问题:给你一个对象,去掉里面属性值为null、""或者undefined的属性

let objs={a:false,b:null,c:undefined,d:''
}const dataType=(obj)=>{if (obj===null) return "Null";if (obj===undefined) return "Undefined";return Object.prototype.toString.call(obj).slice(8,-1);
};const filtrateValue=(obj)=>{var param = {};if ( obj === null || obj === undefined || obj === "" ) return param;for ( var key in obj ){if ( dataType(obj[key]) === "Object" ){param[key] = filtrateValue(obj[key]);}else if(  obj[key] !== null && obj[key] !== undefined && obj[key] !== ""  ){//苏南的专栏 交流:912594095、公众号:honeyBadger8param[key] = obj[key];}}return param;
};
filtrateValue(objs);//{a: false}
5.for of

在es6 中新增了一个 for of 循环,这个还没怎么用过,以后要多用才能记得住,看看例子~

const forOfArr='huixin';
for(let value of forOfArr) {  console.log(value);
};
//h
//u
//i
//x
//i
//n

for in总是得到对像的key或数组,字符串的下标,而for of和forEach一样,是直接得到值

注意:for of不能对对象用

6.set

Set类似于数组,但是成员的值都是唯一的,没有重复的值,也没有索引。用set.size表示伪数组长度

var setArr= [7, 7, 7, 8, 8, 8, 82, 82, 839, 49, 329, 8, 3, 3];//数组去重
var set = new Set(setArr);
var newArr = new Array(...set);
console.log(newArr);//(7) [7, 8, 82, 839, 49, 329, 3]
7.some

这个函数,我觉得只是检测数组中是否有某个元素,符合条件,符合返回true。如果没有满足条件的元素,则返回false。感觉有点像|字符。

var someArr = [2, 13, 18, 20];//检测是否有人小于18岁
let outcome=someArr.some( (age)=>{ return age<18})
console.log(outcome);//true

注意: some() 不会对空数组进行检测。

注意: some() 不会改变原始数组。

8.every

这个函数,检测数组中是否有某个元素,不符合条件,有一个为false,则返回false。如果都满足条件的元素,则返回true。感觉有点像&字符。

var someArr = [2, 13, 18, 20];//检测是否都是未成年
let outcome=someArr.every((age)=>{ return age<18})
console.log(outcome);//false

注意: every() 不会对空数组进行检测。

注意: every() 不会改变原始数组。

9.reduce

​ 最后一个,reduce,刚接触前端的时候,我也不明白,现在到是知道那么一丢丢了。这个方法有点不同,4个参数。接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

​ prev:它是上一次调用回调时返回的结果,每次调用的结果都会给prev

​ cur:当前的元素

​ index:当前的索引

​ arr:循环的数组

var reduceArr = [1,2,3,4,5]//求和var str = reduceArr.reduce((prev,cur,index,arr)=>{return prev + cur ;//苏南的专栏 交流:912594095、公众号:honeyBadger8
})console.log(str);//15

10.Object.keys(obj)

朋友小机灵又帮我添加了一个,可以遍历对象

const forInObj={'111':{name:'huixin',size:'m'},'222':{name:'sunan',size:'l'},'333':{name:'fenshuajiang',size:'s'}
};//苏南的专栏 交流:912594095、公众号:honeyBadger8
Object.keys(forInObj).map(item=>console.log(item,forInObj[item]));//111 {name: "huixin", size: "m"}
//222 {name: "sunan", size: "l"}
//333 {name: "fenshuajiang", size: "s"}

总结

学了这么多,不一定强制我在工作中一定要用到,玩的顺手就好,毕竟每天进步一点点,心里才踏实,哈哈。我是前端挖坑妹,一个每天给自己挖坑的妹子,下次见哈~

觉得不错的话,请记得关注支持我们哦~

其他

  • vue/react/java/大厂面试题等资源免费获取
  • 大家好 这就是2018年的我~
  • 如何给localStorage设置一个有效期?
  • 脱了程序员的格子衫 我是如何月入三万的~
  • 如何给localStorage设置一个有效期?
  • 前端好文汇总分享~
  • 阿里云产品限时优惠

作者:前端挖坑妹
链接:http://susouth.com/
交流:912594095、公众号:honeyBadger8
本文原创,著作权归作者所有。商业转载请联系@IT·平头哥联盟获得授权,非商业转载请注明原链接及出处。

深入了解JavaScript 中的For循环之详解相关推荐

  1. 深入浅出 JavaScript 中的For循环之详解

    点击上方"IT平头哥联盟",选择"置顶或者星标" 一起进步- 公众号回复[ 加群 ],与大佬们一起成长- 今天我想分享一个有关于循环筛选的知识点,也许是前端小白 ...

  2. csh for循环_shell中的for循环用法详解_linux shell

    这篇文章主要介绍了shell中的for循环用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 for 命令: for i i ...

  3. php中this的使用技巧,JavaScript中this关键字使用方法详解

    JavaScript中this关键字使用方法详解 在面向对象编程语言中,对于this关键字我们是非常熟悉的.比如C++.C#和Java等都提供了这个关键字,虽然在开始学习的时候觉得比较难,但只要理解了 ...

  4. java foreach标签_Java中Velocity foreach循环标签详解

    Java中Velocity foreach循环标签详解 Java Velocity中foreach循环可以很容易的遍历数组或者集合. 定义 #foreach( $elem in $allElems) ...

  5. c语言输入循环语句,C语言中输入输出和循环语句详解.ppt

    C语言中输入输出和循环语句详解 C语言的输入输和循环分支语句详解 本章主要向大家介绍下C语言的输入和输出功能以及循环分支语句的使用 第4章 顺序结构程序设计 3.1 C语言语句 3.2 赋值语句 3. ...

  6. JavaScript 中的 this 与闭包详解

    JavaScript 中的 this 一.什么是 this ? 在 JavaScript 中 this 关键字一般指的是 函数调用时 所在的 环境上下文 ,存储了 环境上下文对象的内存地址 ,根据函数 ...

  7. JavaScript中this关键字使用方法详解

    在面向对象编程语言中,对于this关键字我们是非常熟悉的.比如C++.C#和Java等都提供了这个关键字,虽然在开始学习的时候觉得比较难,但只要理解了,用起来是非常方便和意义确定的.JavaScrip ...

  8. javascript中window.event事件用法详解

    前两天写程序时因为要用到javascript中的window.event事件,于是就在网上搜了一下,终于找到一篇不错的文章,来与大家分享下:  描述   event代表事件的状态,例如触发event对 ...

  9. JavaScript中window.open用法实例详解

    本文较为详细的分析了JavaScript中window.open用法.分享给大家供大家参考.具体如下: 复制代码 代码如下: <script LANGUAGE="javascript& ...

最新文章

  1. B S架构 服务器虚拟化,B/S 架构及 Tomcat
  2. 依图科技再破世界记录!AutoML取代人工调参,刷榜三大权威数据集
  3. oracle aced什么资质,ACOUG 中国行—暨Oracle WDP云数据之旅,火热报名中……
  4. jquery的ajax向ashx传中文,出现乱码的解决方法
  5. LINUX设备模型BUS,DEVICE,DRIVER
  6. WPF Tile=” 变量 UI 双向绑定”x:Class=Problem/
  7. MySQL教程(一)—— 数据库设计
  8. 罗斯蒙特电磁流量计8723说明书_罗斯蒙特8732E电磁流量计故障原因及解决办法!...
  9. (pytorch-深度学习系列)深度卷积神经网络AlexNet
  10. 计算机汽车行业术语,汽车行业术语缩写
  11. linux amp;amp; ; amp;amp;amp;amp; ||
  12. MIT大牛Gilbert Strang新书:《线性代数与从数据中学习》抢先看
  13. js闭包,这个算是比较通俗的了(转)
  14. win开启审计功能_一项一项教你测等保2.0——Linux安全审计
  15. webservice服务器框架配置文件,基于Maven环境进行Spring集成CXF WebService框架
  16. java 梯形校正_高清投影神器 联想YOGA平板2 Pro评测
  17. 【重磅整理】180篇NIPS-2020顶会《强化学习领域》Accept论文大全
  18. android rxbus工具类,RxBus的工具类
  19. 华为云学院-人人学loT学习笔记及扩展- 第一章 初识物联网
  20. 编写模板类时注意一点 2007-12-06 11:22

热门文章

  1. 《Python程序设计(第3版)》[美] 约翰·策勒(John Zelle) 第 8 章 答案
  2. 网易云音乐热评API抓取源码
  3. 淘宝、1688采集商品信息详情API
  4. “上市公司易主谜案”背后|一点财经
  5. opencart html模板引擎,Opencart前台HTML、tpl文件的修改,附opencart文件目录
  6. 会议室预约系统项目总结记录
  7. android frp分区,android系统的分区结构
  8. 树莓派frp服务器和客户端配置教程
  9. 三菱FX3U +485 ADP与施耐德ATV-71变频器通讯程序 同时实现变频器 DRIVECOM流程,解决施耐德ATV变频器断电重启后,自准备工作
  10. 分清ASP.NET AJAX中的Extender和Behavior模型