从 forEach 开始谈谈遍历技巧

开发 架构
forEach 作为一个比较出众的遍历操作,之前有很多库都对其进行过各种包装,然而我还是发现很多人并不是非常理解 forEach。如果想了解,请看下面详细内容。

 [[169550]]

forEach

今天从 forEach 开始谈谈遍历吧。

forEach 作为一个比较出众的遍历操作,之前有很多库都对其进行过各种包装,然而我还是发现很多人并不是非常理解 forEach。

比如第二个参数 this 的使用。

往常都习惯这么做: 

  1. const self = this 
  2.  
  3. arr.forEach(function(item) { 
  4.  
  5. // do something with this 
  6.  
  7. }) 

 然而如果使用第二个参数就可以这样: 

  1. arr.forEach(function(item) { 
  2.  
  3. // do something with this 
  4.  
  5. }, this) 

 省去了一个中间的self,看起来更优美了

那么有没有更好的处理方式呢?

有的: 

  1. arr.forEach(item => { 
  2.  
  3. // do something 
  4.  
  5. }) 

 由于 arrow function 的特性,自动绑定父 scope 的 this, 会更加简洁,而且少了个function关键字,可读性更好。

for

说到循环必定要说到for循环了。js里面的for循环有好几种使用方式:

C 系列 for 循环: 

  1. for (let index = 0; index < arr.length; index++) { 
  2.  
  3. // do something 
  4.  

 index 是 arr 的索引,在循环体中通过 arr[index] 调用当前的元素,我非常不喜欢这种方式,因为要写两个分号!

还有另一种比较简单的方式: 

  1. for (let key in obj) { 
  2.  
  3. // do something 
  4.  

 不过这个方式一般用来遍历对象,下文有说。

关于 for 循环还有 ES2015 规定的一种 

  1. for (let item of arr) { 
  2.  
  3. // do something 
  4.  

 这种遍历方式和之前的***区别在于item,它是value而非key,可以直接迭代出内容。

不过这种方式我个人用的不多,因为很多情况下我更喜欢用array下的方法。对于对象的遍历更倾向于for...in

map 系列

这一块是js的函数式领域了。

Array.prototype下挂载着几个非常好用的遍历函数。比如map

它会遍历arr下的所有内容,做操作之后返回数据,形成一个新的数组: 

  1. const arr = [1, 2, 3] 
  2.  
  3. arr.map(current => current * 5) 

 在 react 最常用。经常用来遍历数据,形成dom: 

  1. someRender() { 
  2.  
  3. return this.state.data.map((currentindex) => { 
  4.  
  5. return <li key={index}>{ current }</li> 
  6.  
  7. }) 
  8.  

 不过 map 有一点不好的地方在于不能控制循环的流程,如果不能完成,就返回undefined继续下一次迭代。所以遇到可能会返回undefined的情况应该用forEach或者for循环遍历

还有filter用法和map一模一样,只是它用来过滤数据。非常的好用。

arguments

说到遍历不得不提及arguments, 在function()中的所有参数,奇怪的是它并不是一个数组。只是一个类数组。

一般需要转成数组: 

  1. function foo() { 
  2.  
  3. const args = Array.prototype.slice.call(arguments) 
  4.  
  5. return Array.isArray(args) 
  6.  

 但是我个人并不认同这样的方法,有了新的 ES2015 就不要用这么丑的语法了 

  1. function foo(...args) { 
  2.  
  3. // args 是数组 
  4.  

 ES2015 的 rest 语法使得剩余参数都传入args里面,比之前的还要调Array的方法要轻松不少。

object

对象的遍历是非常常用的功能。

我个人更喜欢用for...in语法,但是有一点需要注意: 

  1. for (let index in obj) { 
  2.  
  3. if(obj.hasOwnProperty(index)) { 
  4.  
  5. // do something 
  6.  
  7.  

 因为除非强制指定,否则对象都是不纯净的。都会有__proto__属性,也会被迭代出来。需要过滤一下。

好了,如何创建纯净的对象? 

  1. const plainObj = Object.create(null

最轻的obj结构,内部没有任何多余的属性。

责任编辑:庞桂玉 来源: segmentfault
相关推荐

2021-03-29 12:01:00

遍历数组for循环

2022-09-07 11:52:48

forforEach前端

2009-11-17 15:57:26

PHP数组合并

2024-03-21 09:51:22

Python爬虫浏览网站

2019-03-04 09:22:52

阿里巴巴foreach Java

2023-06-14 08:54:09

Map方法ForEach方法

2009-07-08 18:28:57

惠普刀片刀片服务器

2018-02-07 16:23:58

连接池内存池AI

2018-02-27 12:41:21

Serverless边缘计算存储

2013-01-11 14:35:46

Windows 8开始屏幕

2021-08-17 10:11:52

DPU计算机数据中心

2022-08-27 14:42:45

Java集合数组

2011-12-03 11:04:21

SSL VPN移动设备

2019-07-02 16:57:20

混合云技术Linux

2009-06-03 15:14:04

SOA应用耦合

2023-05-23 08:01:10

Netty网络通信

2022-12-15 17:15:42

数据库NoSQL

2024-01-05 15:06:04

元素程序员review

2014-12-03 13:26:24

JavaScript

2011-04-12 13:43:17

布线
点赞
收藏

51CTO技术栈公众号