数组的迭代方法在项目中用的好的话就是神器。

数组的迭代方法首先要知道这些方法都会有一个回调函数,数组中的每一项都会调用回调函数,回调函数可以接受三个参数,绝大部分迭代方法的回调函数中三个参数分别是 ’数组中的每一项‘ ,’数组中每一项的索引‘, ’调用迭代方法的整个数组‘

1. Array.every() Array.some()

every()和some()相似 ,都用于查询数组中的项是否满足某个条件,根据方法名的意思很好理解,Array.every()方法数组中的每一项都满足某个条件才返回true,否则返回false,用的不多。Array.some() 数组中的某一项满足某个条件,则返回true,常用。

  1. const arr = [1,2,3,4,5];
  2. const result = arr.every(function(value,index,array){
  3. return (value>2);
  4. });
  5. console.log(result);//false
  6. const result = arr.some(function(value,index,array){
  7. return (value>2);
  8. });
  9. console.log(result);//true

2. Array.find() Array.findIndex()

这两个方法会返回满足回调函数中条件的一项,Array.find()是返回哪一项,Array.findIndex()是返回那一项的索引。使用场景:当需要获得数组中某一满足条件的具体的项或者索引值进行操作

  1. const arr = [
  2. {id:1,name:'dva1'},
  3. {id:2,name:'dva2'},
  4. {id:3,name:'dva3'}
  5. ];
  6. const item2 = arr.find((item) => item.id === 2)// =>item2: {id:2,name:'dva2'}
  7. const index2 = arr.findIndex((item) => item.id === 2) // => index2: 1

3. Array.map()

该方法相当于对数组中的每一项映射,返回这些映射组成的新数组,即n => n。 所以说数组的length不变。

  1. const users = ['dva', 'lhj', 'a', 'b']
  2. const BaseUrl = 'https://api.github.com/users/'
  3. const search = users.map(item => {
  4. return BaseUrl + item
  5. })// => search 是由给定用户名组成的搜索用户的api
  6. // 我们甚至可以直接在map中对这些api发起并发的异步请求
  7. const details = Promise.all(
  8. users.map(item => {
  9. const url = BaseUrl + item;
  10. // 此处假设我们引入了axios
  11. return axios(url)
  12. })
  13. ) // => 此时得到的details是由返回的用户信息组成的数组

4. Array.reduce() Array.reduceRight

Array.reduce(),汇总方法,即n => 1。首先该方法的回调和其他迭代方法回调的参数不太一样,回调函数可以有四个参数,‘前一个值’,‘当前值’,‘第二个参数项的索引’,和‘数组对象’。这个函数返回的每一个值都会作为 第一个参数传给下一项.
下面通过一个简单的应用理解该方法。

  1. const arr = [1,2,3,4,5];
  2. const result = arr.reduce((pre,cur,index,array) => {
  3. return pre +cur;
  4. });
  5. console.log(result);//15
  6. /* 此例中我们只给reduce()方法传入一个回调函数,所以第一次调用回调函数,pre=1,cur=2 ,index=1,
  7. * 第二次调用回调函数时,pre为第一次调用的返回值,此时pre=3,cur=3。依次类推
  8. * 特别注意的是,
  9. * 1.回调函数的第三个参数是第二个参数项的索引,
  10. * 2.每一次执行回调都会将上一次回调的返回值缓存,并传入下一个回调中。
  11. */

Array.reduce() 还可以接受第二个参数,用于指定回调函数的第一个参数。上面的例子中,reduce()方法没有传入第二个参数,所以将数组的第一项作为回调的第一个参数。

  1. /* 传入两个参数 */
  2. const arr = [1,2,3,4,5];
  3. const result = arr.reduce((pre,cur,index,array) => {
  4. return pre +cur;
  5. },10);
  6. console.log(result);//25
  7. /*传入的第二个参数定义pre的初始值。然后遍历和一个参数时一样。*/

reduceRight()方法除了和reduce()方法遍历的方向不同,其它完全相同。从数组最后一项向第一项遍历

5. Array.filter()

对数组中的每一项执行回调,根据回调中定义的规则对这些项进行过滤,返回满足条件的项组成的数组

  1. const list = ['dva', 'ddd', 'lhj', 'bd'];
  2. const filterList = list.filter(item => {
  3. return item.includes('d'); // 过滤数组中包含 'd' 的项
  4. }) // => [ 'dva', 'ddd', 'bd' ]

值得注意的是,这些迭代方法,当数组中有’空值’不会执行回调,undefined会执行,下面以Array.map()为例进行分析

  1. let a;
  2. const newarr = [1,2,3,,5,a]; // =>[ 1, 2, 3, <1 empty item>, 5 ]
  3. const result = newarr.map((value,index,array) => {
  4. alert('我执行了');//执行了5次
  5. return value*2;
  6. });
  7. console.log(result);// => [ 2, 4, 6, <1 empty item>, 10, NaN ]

冲鸭!!!