热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ES5和ES6数组遍历要领详解

ES5和ES6数组遍历要领详解在ES5中经常运用的10种数组遍历要领:1、原始的for轮回语句2、Array.prototype.forEach数组对象内置要领3、Array.pr
ES5和ES6数组遍历要领详解

在ES5中经常运用的10种数组遍历要领:

1、原始的for轮回语句

2、Array.prototype.forEach数组对象内置要领

3、Array.prototype.map数组对象内置要领

4、Array.prototype.filter数组对象内置要领

5、Array.prototype.reduce数组对象内置要领

6、Array.prototype.some数组对象内置要领

7、Array.prototype.every数组对象内置要领

8、Array.prototype.indexOf数组对象内置要领

9、Array.prototype.lastIndexOf数组对象内置要领

10、for…in轮回语句

ES6中新增加了一种:

1.for…of轮回语句

ES5三种数组轮回示例以下:

原始for轮回语句

Example1

var a = [1,2,3];
for(var i=0;i console.log(a[i]); //结果依次为1,2,3
}

代码解读:原始for轮回的长处在于人人都比较熟习,轻易明白,劣势是写起来比较烦琐,须要定义分外更多的变量,所以一下是针关于原始for轮回的改进的两种写法:
Example1:写法改进版

var a = [1,2,3];
for(var i=a.length;i--;){
console.log(a[i]); //结果依次为3,2,1
}

Example2:机能改进版

var a = [1,2,3];
for(var i = 0,len=a.length; i console.log(a[i]); //结果依次为1,2,3
}

注重:以上代码能够写成如许呢,假如懵逼了的话接着看原始for轮回的解读,我们都晓得for轮回包括三个语句块——>for(语句1;语句2;语句3){被实行的代码},个中,语句1平常为变量定义语句(不仅能够只定义一个变量哦),在轮回最先前实行,而且只实行一次语句2定义轮回的是不是继承实行的前提,一样也是在轮回最先前实行,语句1以后实行,每次重新最先轮回都邑再次实行语句3则在轮回完毕以后实行,而且每次完毕的时刻都邑再次实行,这里要注重的是假如被实行的代码半途return出来了那是不会再实行一次语句3的,所以以上代码诠释以下:因为i–这个语句在每次轮回最先前都邑再次先用 i 是true和false来推断是不是继承实行,这里一样要注重的是因为i––i的区分,这里因为是i–所以会先推断i的值再去做‘减减’的操纵,所以这里末了假如打印 i 的值,会发明实际上是-1

数组内置要领Array.prototype.forEach

Example

var a = [1,2,3];
a.forEach(function(value,key,arr){
console.log(value) // 结果依次为1,2,3
console.log(key) // 末端依次为0,1,2
console.log(arr) // 三次结果都为[1,2,3],该参数貌似没什么用
})

代码解读:forEach要领最大的优点就是便于运用,而且不必定义分外的参数变量,然则从效力以及机能角度来讲它是劣于原始for轮回的,而且也不能强迫return完毕轮回,缘由以下:

**forEach轮回**一看就是经由历程**回调函数**来供应参数的,而回调函数在JS中是**闭包**的一种,闭包的作用是用来天生**私有作用域**的,所以,每个回调函数都是一个**自力的作用域**,都具有自身自力的存储空间,互不影响,而且内部变量还不实时开释,这也就是为何在能不必闭包的情况下就不要用闭包的缘由,而在闭包中return的话,也只是在当前回调函数中返回了,但是forEach中的其他的回调函数(闭包)依然存在,所以,致使return是没办法完毕轮回的。下面写一个forEach轮回完成例子供人人参考明白:

Example

Array.prototype.forEachCopy = function(callback){
var arr = this;
for(var i=0;i callback(arr[i],i,this);
}
}
var a = [1,2,3];
a.forEachCopy(function(value,key,arr){
console.log(value) // 结果依次为1,2,3
console.log(key) // 末端依次为0,1,2
console.log(arr) // 三次结果都为[1,2,3]
})

数组内置要领Array.prototype.map

Example

var a = [1,2,3];
var b = a.map(function(value,key,arr){
console.log(value) // 结果依次为1,2,3
console.log(key) // 末端依次为0,1,2
console.log(arr) // 三次结果都为[1,2,3]
return value+1;
})
console.log(a); // 结果为[ 1, 2, 3 ]
console.log(b); // 结果为[ 2, 3, 4 ]

代码解读:map和forEach差别,在forEach中return语句是没有任何结果的,而map则能够转变当前轮回的值,而且最终会返回一个新的被转变过值以后的数组(map假如不必return就和forEach一样了),因为这个特征,map平常用来处置惩罚须要修正某一个数组的值。map和forEach在其他的方面都是一样的,也不能return完毕轮回等特征,下面写一个map轮回完成的例子供人人参考明白:
Example

Array.prototype.mapCopy = function(callback){
var arr = this;
var arrCopy = [];
for(var i=0;i var cbValue = callback(arr[i],i,this);
arrCopy.push(cbValue);
}
return arrCopy;
}
var a = [1,2,3];
var b = a.mapCopy(function(value,key,arr){
console.log(value) // 结果依次为1,2,3
console.log(key) // 末端依次为0,1,2
console.log(arr) // 三次结果都为[1,2,3]
return value+1;
})
console.log(a); // 结果为[ 1, 2, 3 ]
console.log(b); // 结果为[ 2, 3, 4 ]

数组内置要领Array.prototype.filter

Example

var a = [1,2,3];
var b = a.filter(function(value,key,arr){
console.log(value) // 结果依次为1,2,3
console.log(key) // 末端依次为0,1,2
console.log(arr) // 三次结果都为[1,2,3]
if(value === 3){
return false;
}
return true;
})
console.log(a); // 结果为[ 1, 2, 3 ]
console.log(b); // 结果为[ 1,2 ]

代码解读:filter和map差别,map目标是为了转变值,而filter目标是为了去掉不要的值,在轮回的时刻假如返回的是false那末就示意本次轮回的不增加该值,返回true则相反是示意要增加到新建的数组中,下面写一个filter轮回完成例子供人人参考:
Example

Array.prototype.filterCopy = function(callback){
var arr = this;
var arrCopy = [];
for(var i=0;i var cbValue = callback(arr[i],i,this);
if(cbValue){
arrCopy.push(arr[i]);
}
}
return arrCopy;
}
var a = [1,2,3];
var b = a.filterCopy(function(value,key,arr){
console.log(value) // 结果依次为1,2,3
console.log(key) // 末端依次为0,1,2
console.log(arr) // 三次结果都为[1,2,3]
if(value === 3){
return false;
}
return true;
})
console.log(a); // 结果为[ 1, 2, 3 ]
console.log(b); // 结果为[ 1,2 ]

数组内置要领Array.prototype.reduce

Example

var a = [1,2,3];
var b = a.reduce(function (count, value,key,arry) {
console.log(count); // 结果依次为0,1,3
console.log(value); // 结果依次为1,2,3
console.log(key); // 结果依次为0,1,2
console.log(arry) // 三次结果都为[1,2,3]
return count + value;
},0);
console.log(a); // 结果为[ 1, 2, 3 ]
console.log(b) // 结果为6

代码解读:reduce的差别之处在于累加,和其他几个内置要领差别的处所,它的第二个参数不是this对象,而是初始累加值(假如不设置的话数组会乱掉),而且回调函数的的个数也差别,比其他的多了一个,而且还在在最先的多加了一个参数,第一个参数纪录的是上一次轮回的累加值,下面写一个reduce轮回完成例子供人人参考:
Example

Array.prototype.reduceCopy = function(callback,countInit){
var arr = this;
for(var i=0;i var cbValue = callback(countInit,arr[i],i,this);
countInit = cbValue;
}
return countInit;
}
var a = [1,2,3];
var b = a.reduceCopy(function (count, value,key,arry) {
console.log(count); // 结果依次为0,1,3
console.log(value); // 结果依次为1,2,3
console.log(key); // 结果依次为0,1,2
console.log(arry) // 三次结果都为[1,2,3]
return count + value;
},0);
console.log(a); // 结果为[ 1, 2, 3 ]
console.log(b) // 结果为6

数组内置要领Array.prototype.some

Example

var a = [1,2,3];
var b = a.some(function(value,key,arry){
console.log(value); // 结果依次为1,2
console.log(key); // 结果依次为0,1
console.log(arry); // 两次次结果都为[1,2,3]
return value===2;
})
console.log(a); // 结果为[ 1, 2, 3 ]
console.log(b); // 结果为true

代码解读:some的差别之处在它返回的布尔值,它的作用有点像filter,不过它的目标不是为了挑选返回数组,而是为了挑选该数组是不是有满足你要的值,而且找到相符前提的值返回了一次true以后就不会再继承实行了,下面写一个some轮回完成例子供人人参考:

Example

Array.prototype.someCopy = function(callback,countInit){
var arr = this;
var isBool = false;
for(var i=0;i var cbValue = callback(arr[i],i,this);
if(cbValue){
isBool = true;
return isBool
}
}
return isBool;
}
var a = [1,2,3];
var b = a.someCopy(function(value,key,arry){
console.log(value); // 结果依次为1,2
console.log(key); // 结果依次为0,1
console.log(arry); // 两次次结果都为[1,2,3]
return value===2;
})
console.log(a); // 结果为[ 1, 2, 3 ]
console.log(b); // 结果为true

数组内置要领Array.prototype.every

Example

var a = [1,2,3];
var b = a.every(function(value,key,arry){
console.log(value); // 结果依次为1,2
console.log(key); // 结果依次为0,1
console.log(arry); // 两次次结果都为[1,2,3]
return value===2;
})
console.log(a); // 结果为[ 1, 2, 3 ]
console.log(b); // 结果为false

代码解读:实在从看例子能够看出来,some和every作用是一样的,只不过some当找到以后返回的是true,而every找到以后返回的是false罢了,下面写一个every轮回完成例子供人人参考:

Example

Array.prototype.everyCopy = function(callback){
var arr = this;
var isBool = true;
for(var i=0;i var cbValue = callback(arr[i],i,this);
if(cbValue){
isBool = false;
return isBool
}
}
return isBool;
}
var a = [1,2,3];
var b = a.everyCopy(function(value,key,arry){
console.log(value); // 结果依次为1,2
console.log(key); // 结果依次为0,1
console.log(arry); // 两次次结果都为[1,2,3]
return value===2;
})
console.log(a); // 结果为[ 1, 2, 3 ]
console.log(b); // 结果为false

数组内置要领Array.prototype.indexOf

Example

var a = [1,2,3];
var b = a.indexOf(2);
console.log(a); // 结果为[ 1, 2, 3 ]
console.log(b); // 结果为1

代码解读:关于indexOf要领来讲,在数组轮回历程中会和传入的参数比对,假如是比对胜利,那末停止轮回,返回对照胜利的下标,下面写一个indexOf轮回完成例子供人人参考:

Example

Array.prototype.indexOfCopy = function(value){
var arr = this;
var index = -1;
for(var i=0;i if(arr[i] === value){
index = i;
return index
}
}
return index;
}
var a = [1,2,3];
var b = a.indexOfCopy(2);
console.log(a); // 结果为[ 1, 2, 3 ]
console.log(b); // 结果为1

数组内置要领Array.prototype.lastIndexOf

Example

var a = [1,2,3,1];
var b = a.lastIndexOf(1);
console.log(a); // 结果为[ 1, 2, 3, 1 ]
console.log(b); // 结果为1

代码解读:lastIndexOf要领和indexOf作用一致,但查找方向差别,indexOf是正向查找,lastIndexOf是你像查找,找到以后返回胜利的下标,下面写一个lastIndexOf轮回完成例子供人人参考:

Example

Array.prototype.lastIndexOf = function(value){
var arr = this;
var index = -1;
for(var i=arr.length;i--;){
if(arr[i] === value){
index = i;
return index
}
}
return index;
}
var a = [1,2,3,1];
var b = a.lastIndexOf(1);
console.log(a); // 结果为[ 1, 2, 3 , 1 ]
console.log(b); // 结果为3

小结:关于以上8个数组的内置要领,forEach要领仅仅只是为了轮回,并不能够帮你做分外的事变;map要领相当于在轮回的时刻你通知数组当前遍历的这个值须要改成什么样,那末它就会末了给什么样的数组;filter要领相当于在轮回的时刻数组遍历一个个对象,并问你这个是不是是你要找的值,假如你说是,他就会给你返回一个到新的数组中,不是他就会剔除;reduce要领相当于轮回遍历对象做统计(累加或许累减之类的);some和every要领相当于在遍历的时刻拿着一个个对象问你这个是不是是你找的,只需你说了一遍是,那末他就会给你离别返回的是true和false;indexOf和lastIndexOf要领相当于你通知它你要找什么值,找到以后立马返回给你它的门牌号。

轮回语句for…in

Example

var a = [1,2,3];
for(var key in a){
console.log(key); //结果为依次为0,1,2
}
var b = {0:1,1:2,2:3};
for(var key in b){
console.log(key); //结果为依次为0,1,2
}

代码解读:从结果得知,for…in遍历数组的时刻是遍历数组的下标值,而在遍历对象的时刻遍历的是key值,所以猜测,数组在JS中,本质上也是一个以键值对情势存在的对象,而为了证实这点,我们做以下一个例子的试验:

var a = [];
a['b'] = 2;
console.log(a); //结果为[ b: 2 ]
console.log(a[0]); //结果为undefined

我们发明数组的下标不在对应响应位置的值了,由此能够证实在JS中数组实在本质上就是一个以下标为key值的对象。
固然关于for…in轮回语句自身而言,它是一个浅度遍历对象的轮回语句,值遍历第一层节点(固然对象中设置不可枚举的属性的除外)。
Example

var a = {b:{c:2},d:{c:4}};
for(var key in a){
console.log(key); //结果为依次为b,d
}

ES6轮回for…of语句

Example

var a = [1,2,3];
for(var value of a){
console.log(value) // 结果依次为1,2,3
}

代码解读:for…of语句看着有点像for…in语句,然则和for…in语句差别的是它不能够轮回对象,只能轮回数组。


推荐阅读
  • vue使用
    关键词: ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了获取关联数组键的列表的方法,即使用Object.keys()函数。同时还提到了该方法在不同浏览器的支持情况,并附上了一个代码片段供读者参考。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
author-avatar
美娟婉燕6386
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有