JavaScript数据迭代方法差别
js有很多总迭代方法,ES6之后又新增了几个;
这里主要讨论数组迭代遍历的方法所以不会细讲for...in...
ES5、ES6数组迭代方法有:
- forEach
- map
- filter
- some
- every
- reduce/reduceRight
- find/findIndex (ES6新增)
- for...of... (ES6新增)
forEach
forEach对数组的每个元素执行一次提供的函数。forEach方法无法中断执行总是会将所有成员遍历完,如果希望符合某种条件时就中断的话遍历时要使用传统for循环,forEach无法 使用break,continue跳出循环,使用return时效果和在for循环中使用continue一样。最为重要的一点是可以添加第二个参数,为一个数组而且回调函数中的this会指向这个数组而如果没有第二个参数则this会指向window,严格模式下是undefined。
var arr = [1, 2, 3];
arr.forEach(function (element, index, array) {
console.log(element, index, array)
})
//output
1 0 [1, 2, 3]
2 1 [1, 2, 3]
3 2 [1, 2, 3]
map
map方法的作用就是将原数组按照一定的规则映射成一个新的数组。再将其返回,是返回一个新的数组,而不是将原数组直接改变。使用方法和参数都跟forEach相似。值得注意的是map需要有返回值,
没有的话某些情况下返回数组中元素为undefined
var data = [1, 2, 3];
var arrayOfSquares = data.map(function (element) {
return element * element;
});
console.log(arrayOfSquares); //[1, 4, 9]
filter
filter返回过滤后的新数组。用法和参数跟map差不多。与map方法不同的是,filter方法的callback函数需要返回弱等于true或false的值。如果为true,则通过,否则,不通过。
var arr = [0, 1, 2, 3];
var newArr = arr.filter(function (element, index, array) {
return e;
})
var newArr2 = arr.filter(function (element, index, array) {
return e>=2;
})
console.log(newArr); // [1, 2, 3]
console.log(newArr2); // [2, 3]
some
some方法是只要数组中的某个值,符合你给定的判断条件就返回true;否则,返回false。用法和参数跟前面的方法一样。
function isBigEnough(element, index, array) {
return element >= 4;
}
var passed = [1, 2, 3].some(isBigEnough);
var passed2 = [1, 2, 3, 4].some(isBigEnough);
console.log(passed); // false
console.log(passed2); // true
every
every方法与some方法相对,every方法是数组中的所有值都符合你给定的判断条件的时候才会返回true,否则就返回false。
function isBigEnough(element, index, array) {
return element >= 3;
}
var passed = [2, 3, 4].every(isBigEnough);
var passed2 = [3, 4, 5].every(isBigEnough);
console.log(passed); // false
console.log(passed2); // true
reduce/reduceRight
reduce/reduceRight相对比较复杂,其接收两个参数,第一个是回调,第二个是初始值初始值不写的话默认就是回调中的第一个参数。
array.reduce(callback,[initialValue])
其中callback可以依次接受四个参数:
accumulator上一次调用回调返回的值,或者是提供的初始值(initialValue)currentValue数组中正在处理的元素currentIndex数组中正在处理的元素索引,如果提供了initialValue,从0开始;否则从1开始。array数组对象本身
var sum = [0,1,2,3,4].reduce(function(accumulator, currentValue, currentIndex, array){
console.log(accumulator, currentValue, currentIndex, array)
return accumulator + currentValue;
});
console.log(sum);
// output
0 1 1 [0, 1, 2, 3, 4]
1 2 2 [0, 1, 2, 3, 4]
3 3 3 [0, 1, 2, 3, 4]
6 4 4 [0, 1, 2, 3, 4]
10
传入第二个参数的时候
var sum = [0,1,2,3,4].reduce(function(accumulator, currentValue, currentIndex, array){
console.log(accumulator, currentValue, currentIndex, array)
return accumulator + currentValue;
}, 10);
console.log(sum);
// output
10 0 0 [0, 1, 2, 3, 4]
10 1 1 [0, 1, 2, 3, 4]
11 2 2 [0, 1, 2, 3, 4]
13 3 3 [0, 1, 2, 3, 4]
16 4 4 [0, 1, 2, 3, 4]
20
从上面的情况可以看出:不提供initialValue ,reduce方法会从索引1的地方开始执行callback方法,跳过第一个索引。提供 initialValue,从索引0开始。
同时,是否提供initialValue对于回调函数第一次执行时,accumulator和currentValue的取值有两种情况:调用reduce时提供initialValue,accumulator取值为initialValue,currentValue取数组中的第一个值;没有提供initialValue ,accumulator取数组中的第一个值,currentValue取数组中的第二个值。
reduceRight与reduce类似,不同之处在于它是从最后一个值开始计算的。
find / findIndex
find方法用于找出第一个符合条件的数组成员。它的参数跟forEach方法是一样的;所有数组成员依次执行回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined。findIndex方法和find相似;不过它返回数组中符合条件的元素的索引。如果所有成员都不符合条件,则返回-1。
find
var value = [1, 5, 10, 15].find(function(element, index, array) {
return element > 9;
});
var value2 = [1, 5, 10, 15].find(function(element, index, array) {
return element > 20;
});
console.log(value); //
console.log(value2); // undefined
findIndex
var value = [1, 5, 10, 15].findIndex(function(element, index, array) {
return element > 9;
});
var value2 = [1, 5, 10, 15].findIndex(function(element, index, array) {
return element > 20;
});
console.log(value); //
console.log(value2); // -1
for...of...
for...of...是ES6新增的一个循环遍历方式用法跟for...in...差不多但是这个常用于数组操作
var arr = [0, 1, 2, 3];
for(let i of arr) {
console.log(i*2)
}
//
//
//
//
for...of...也可以遍历字符串
var str = "string"
for(let s of str) {
console.log(s)
}
// s
// t
// r
// i
// n
// g
以上就是常见一些数据(基本上是数组)迭代遍历的一些API,有不对的欢迎大家指正
JavaScript数据迭代方法差别的更多相关文章
- JavaScript 之迭代方法
前言:关于 JS 中为数组定义的迭代方法,我最开始是在<JavaScript高级程序设计>中学习的,然后...我并没有看懂,后来翻阅各个大佬的博客,稍微理解了那么一丢丢.以下就是我的一点见 ...
- 松软科技web课堂:JavaScript 数组迭代方法
数组迭代方法对每个数组项进行操作,听着挺高深,其实,就是对数组对象一次性逐一进行一种操作的一种叫法.(文章来源:www.sysoft.net.cn,加v:15844800162深度交流) Array. ...
- JavaScript五中迭代方法小解
ECMAScript 为数组定义了五个迭代方法.每个方法都接收两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域对象——影响this的值.传入这些方法中的函数会接收三个参数:数组项的值.该 ...
- javaScript 数组迭代方法
map 方法 解释:map即映射,返回对每项操作后组成的新数组 let arr=[1,2,3,4,5,6,7,8]; let newArr=arr.map((item)=>{ if(item&g ...
- Javascript数组系列三之迭代方法2
今天我们来继续 Javascript 数组系列的文章,上文 <Javascript数组系列二之迭代方法1> 我们说到一些数组的迭代方法,我们在开发项目实战的过程中熟练的使用可以大大提高我们 ...
- Javascript数组系列二之迭代方法1
我们在<Javascript数组系列一之栈与队列 >中介绍了一些数组的用法.比如:数组如何表现的和「栈」一样,用什么方法表现的和「队列」一样等等一些方法,因为 Javascript 中的数 ...
- JavaScript中数组的迭代方法:forEach、map、filter、reduce、every、some、for in、for of
JavaScript中有非常多数组迭代方法,这里基本上吧所有的都介绍全了,我项目中比较喜欢的是forEach. 7.for in (for-in循环实际是为循环对象而设计的,for in也可以循环数组 ...
- JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)
1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法. 2.有时候需要传递大量可选参数的情形时,一 ...
- javascript——迭代方法
<script type="text/javascript"> //五个迭代方法 都接受两个参数:要在每一项上运行的函数 和 运行该函数的作用域(可选) //every ...
随机推荐
- hql(Hibernate Query Language)
1.Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此Hibernate ...
- ABB中断设定
简介: 中断是程序定义事件,通过中断编号识别.中断发生在中断条件为真时.中断不同于其他错误,前者与特定消息号位置无直接关系(不同步).中断会导致正常程序执行过程暂停,跳过控制,进入软中断程序. 即使机 ...
- Oracle实战笔记(第六天)之PL/SQL基础
一.PL/SQL介绍 1.概念 PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语 ...
- CentOS 6.3 64位下MySQL5.1.54源码安装配置详解
安装环境:CentOS 6.3 64位 一:先安装依赖包(不然配置的时候会报错的!) yum -y install ncurses* libtermcap* 新建mysql用户 [root@clien ...
- Java 调用python说明文档
Java 调用python说明文档 通过java调用python脚本主要如下三种方式: 1.直接执行python脚本: 2.执行python.py文件: 3.使用Runtime.getRuntime( ...
- underscore.js 源码阅读 一 整体结构
// 整个underscore的实现包在一个立即执行函数中,避免污染全局对象 // 通过call(this)来入全局变量 (function() { // 缓存this var root = this ...
- python_如何修改装饰器中参数?
案例: 为分析程序内哪些函数执行时间开销较大,我们需定义一个带timeout参数的装饰器 需求: 统计被装饰函数的运行时间 时间大于timeout时,将此次函数调用记录到log日志中 运行时可以修改t ...
- python urllib2与urllib
1.urllib2可以接受一个Request对象,并以此可以来设置一个URL的headers,但是urllib只接收一个URL. 2.urllib模块可以提供进行urlencode的方法,该方法用于G ...
- JDK自带的Timer类
Timer类负责设定TimerTask的起始和间隔执行时间.具体的执行任务,由用户创建一个TimerTask的继承类,并实现其run()方法 timer.schedule()
- java IO(一):File类
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...