前言

集合遍历是我们实现业务逻辑的常用手段之一,我们几乎每天都会使用到它去操作集合元素。今天就梳理一下一些常用的集合遍历方式。

1.for(let i = 0;i <length;i++)循环

这是我们最早接触的遍历集合的方式,简单容易理解,按照集合的索引顺序遍历集合的内容。数组Array的最大长度使用arr.length表示,其他集合使用size()函数表示。但是对于Set和Map来说这种方式不适用,因为没有取出下标对应值的方法。示例如下:


[javascript]


1. let arr = [2,4,6,8,10,12];  
2. for (let i = 0;i < arr.length;i ++) {  
3.     console.log(arr[i]);  
4. }


接下来的几种方式也是ES6支持的方法,主要通过回调函数的方式读取数据

2.forEach(ck)

forEach看起来更加简洁,但这种方法也有一个小缺陷:你不能使用break语句中断循环,也不能使用return语句返回到外层函数。

[html] 


    1. //数组的遍历  
    2. let arr = [2,4,6,8,10,12];  
    3. //回调函数简化前方式  
    4. //value:索引值,index:下标,arr:要遍历的数组  
    5. arr.forEach(function (value,index,arr) {  
    6.     console.log(index + ":" + value);  
    7. })  
    8.   
    9. //ES6后可以使用箭头函数  
    10. arr.forEach((v,k)=>{  
    11.     console.log(k + ":" + v);  
    12. })  
    13.   
    14. //set的遍历  
    15. let set = new Set(arr);  
    16. set.forEach((v,k)=>{  
    17.     console.log(k + ":" + v);//k和v是相同的  
    18. })  
    19.   
    20. //Map的遍历  
    21. let map = new Map().set(1,"apple")  
    22.                    .set(2,"pear")  
    23.                    .set(3,"balnana")  
    24.                    .set(4,"orange");  
    25. //遍历key,value  
    26. map.forEach((v,k)=>{  
    27.     console.log(k + ":" + v);  
    28. })  
    29.   
    30. //遍历key,value  
    31. map.forEach((v,k)=>{  
    32.     console.log(k + ":" + v);  
    33. })

    3.for (.. of ..) 

    ES6引入了iterable类型,Array,Map,Set都属于iterable类型,它们可以使用for...of循环来遍历,意思为循环集合中的元素。注意区别于for...in用法,这是遍历对象属性的。示例如下


    [javascript] 

    1. //数组的遍历  
    2. let arr = [2,4,6,8,10,12];  
    3. for (let v of arr) {  
    4.     console.log(v);  
    5. }  
    6.   
    7. //set的遍历  
    8. let set = new Set(arr);  
    9. for (let v of set) {  
    10.     console.log(v);  
    11. }  
    12.   
    13. //Map的遍历  
    14. let map = new Map().set(1,"apple")  
    15. "pear")  
    16. "balnana")  
    17. "orange");  
    18. //遍历key,value  
    19. for (let [k,v] of map) {  
    20. ":" + v);  
    21. }   
    22.   
    23. //遍历keys  
    24. for (let k of map.keys()) {  
    25.     console.log(k)  
    26. }   
    27.   
    28. //遍历values  
    29. for (let k of map.values()) {  
    30.     console.log(k)  
    31. }  
    32.   
    33. //遍历entries  
    34. for (let [k,v] of map.entries()) {  
    35. ":" + v)  
    36. }


    • 这是最简洁、最直接的遍历数组元素的语法
    • 这个方法避开了for-in循环的所有缺陷
    • 与forEach()不同的是,它可以正确响应break、continue和return语句

    接下来的遍历方法的回调函数是有返回值的,并且只正对数组,ck指callback函数

    4.map(ck)

    map就是映射的意思,将原对象映射为新的数组,每个数组元素都执行一次ck函数,最后返回每次元素执行ck函数后返回值的集合(数组)。


    [html] 


    1. //数组的遍历  
    2. let arr = [2,4,6,8,10,12];  
    3. let newArr = arr.map((v,k)=>v*2);  
    4. newArr.forEach((v,k)=>{console.log(v)}); //输出4 8 12 16 20 24  
    5.   
    6. arr = [{"name":"tom",salary:1200},{"name":"Tony",salary:1300}]  
    7. newArr = arr.map((v,k)=>v.salary*2);  
    8. newArr.forEach((v,k)=>{console.log(v)});//输出2400 2600

    5.some(ck)

    此方法用于判断数组中是否有满足条件的元素,如果有则返回true,没有则返回false

    [html]


    1. //数组的遍历  
    2. let arr = [2,4,6,8,10,12];  
    3.   
    4. //判断是否有大于10的元素  
    5. let res = arr.some((v,k)=> v>10);  
    6. console.log(res);  //输出true  
    7.   
    8. //判断是否有大于20的元素  
    9. res = arr.some((v,k)=> v>20);  
    10. console.log(res);  //输出false


    6.filter(ck)

    filter过滤,用于过滤数组中符合条件的元素,和map方法一样,返回的是一个数组映射。

    [html] 


    1. let arr = [2,4,6,8,10,12];  
    2. //将大于5的元素提取出来  
    3. let res = arr.filter((v,k)=> v>5);  
    4. res.forEach((v)=>console.log(v));

    7.every(ck)

    every与some相似,从英文意思上来讲some表示"一些",数组中只要有满足条件的就会返回true;every表示"每一个",只要有一个不满足条件就返回false;

    [html]

    1. let arr = [2,4,6,8,10,12];  
    2. //判断是否每一个元素都大于5  
    3. let res = arr.every((v,k)=> v>5);  
    4. console.log(res); //输出false  
    5.   
    6. //判断是否每一个元素都大于1  
    7. res = arr.every((v,k)=> v>1);  
    8. console.log(res); //输出true


    8.reduce(ck,[init]),ck回调函数,init初始值

    reduce英文意思是减少,缩少,还有浓缩的意思(学好英文很重要。。。),意思就是按照callback规则累积运算得出一个计算结果。

    [html] 


    1. let arr = [2,4,6,8,10,12];  
    2. //判断是否每一个元素都大于5  
    3. let res = arr.reduce((x,y)=>x+y,2);  
    4. console.log(res); //输出44