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函数需要返回弱等于truefalse的值。如果为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对于回调函数第一次执行时,accumulatorcurrentValue的取值有两种情况:调用reduce时提供initialValueaccumulator取值为initialValuecurrentValue取数组中的第一个值;没有提供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数据迭代方法差别的更多相关文章

  1. JavaScript 之迭代方法

    前言:关于 JS 中为数组定义的迭代方法,我最开始是在<JavaScript高级程序设计>中学习的,然后...我并没有看懂,后来翻阅各个大佬的博客,稍微理解了那么一丢丢.以下就是我的一点见 ...

  2. 松软科技web课堂:JavaScript 数组迭代方法

    数组迭代方法对每个数组项进行操作,听着挺高深,其实,就是对数组对象一次性逐一进行一种操作的一种叫法.(文章来源:www.sysoft.net.cn,加v:15844800162深度交流) Array. ...

  3. JavaScript五中迭代方法小解

    ECMAScript 为数组定义了五个迭代方法.每个方法都接收两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域对象——影响this的值.传入这些方法中的函数会接收三个参数:数组项的值.该 ...

  4. javaScript 数组迭代方法

    map 方法 解释:map即映射,返回对每项操作后组成的新数组 let arr=[1,2,3,4,5,6,7,8]; let newArr=arr.map((item)=>{ if(item&g ...

  5. Javascript数组系列三之迭代方法2

    今天我们来继续 Javascript 数组系列的文章,上文 <Javascript数组系列二之迭代方法1> 我们说到一些数组的迭代方法,我们在开发项目实战的过程中熟练的使用可以大大提高我们 ...

  6. Javascript数组系列二之迭代方法1

    我们在<Javascript数组系列一之栈与队列 >中介绍了一些数组的用法.比如:数组如何表现的和「栈」一样,用什么方法表现的和「队列」一样等等一些方法,因为 Javascript 中的数 ...

  7. JavaScript中数组的迭代方法:forEach、map、filter、reduce、every、some、for in、for of

    JavaScript中有非常多数组迭代方法,这里基本上吧所有的都介绍全了,我项目中比较喜欢的是forEach. 7.for in (for-in循环实际是为循环对象而设计的,for in也可以循环数组 ...

  8. JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)

    1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法.   2.有时候需要传递大量可选参数的情形时,一 ...

  9. javascript——迭代方法

    <script type="text/javascript"> //五个迭代方法 都接受两个参数:要在每一项上运行的函数 和 运行该函数的作用域(可选) //every ...

随机推荐

  1. CCF系列之相邻数对(201409-1)

    试题编号: 201409-1 时间限制: 1.0s 内存限制: 256.0MB 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 输入的第一行包含一个整数n,表示给 ...

  2. eclipse代码编辑区字符串自动转义设置

    在做接口测试时,有时接口请求参数非常多,如果用java相关方法去拼接参数,难度较大,并且非常浪费时间,那如何快速将整个请求参数拼接成一个字符串呢?为了解决这个问题,只要简单配置下eclipse设置即可 ...

  3. 基础 - 32位操作系统最多只支持4G内存。

    32位操作系统最多只支持4G内存. CPU能不能直接访问硬盘的数据呢, 不能. 只能通过把硬盘的数据先放到内存里, 然后再从内存里访问硬盘的数据.我们平时玩游戏碰上读图loading 进度条的这个过程 ...

  4. linux 如何降低入向软中断占比

    最近遇到一个问题,当tcp收包的时候,我们的服务器的入向软中断比例很高. 我们知道,napi模式,可以降低收包入向软中断占比,那么,针对napi模式,能不能优化?本文针对2.6.32-358内核进行分 ...

  5. Eclipse设置代码自动提示

    Eclipse只需几步简单的设置就可以像idea那样代码自动提示了,喜欢的小伙伴可以赶紧动手设置,提升效率. 第一步:打开Eclipse --> Window --> Preference ...

  6. Spring ioc,aop的理解

    什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容器控制程序之间的关系,而不是由代码直接控制 由于控制权由代码转向了容器,所以称为反转 依赖注入,作用是避免手工在各代 ...

  7. org.json.JSONObject的optXXX方法

    JSONObject有很多optXXX方法,比如optBoolean,optString,optInt.... 他们的意思是:如果这个JSONObject对象,如果有返回这个属性的值,如果没有返回一个 ...

  8. 【转】python入门指引

    http://matrix.42qu.com/10757179 前言 其实我也不知道python怎么入门,由我来写这个真的不是很合适.我学python是直接找了dive into python来看.然 ...

  9. 【转载】Linux时间相关结构与函数

    1 时间的获取 在程序当中, 我们经常要输出系统当前的时间,比如日志文件中的每一个事件都要记录其产生时间.在 C 语言中获取当前时间的方法有以下几种,它们所获得的时间精度从秒级到纳秒,各有所不同. 表 ...

  10. 【转】SED多行模式空间

    在前面看到的都是单行模式.每次sed处理一个行. 但是sed是允许一次处理多行的.这就是所谓的多行模式空间. 多行模式空间命令有(N.D.P),他们分别对应单行模式空间(n.d.p). 分别是他们的多 ...