js遍历集合

遍历

for-in

  • 只遍历对象自身的和继承的可枚举的属性

    Object.prototype.enumer=function(){
        console.log("可枚举的");
    }
    
    var obj={a:1,b:2};
    for(var o in obj){
        console.log(o);
    }
    
    // a
    // b
    // enumer
    
    //enumer是继承来的可枚举属性
  • 在遍历数组时不建议使用,因为for-in遍历不能保证遍历顺序,并且如果数组原型上添加了属性,也会被遍历出来;
建议:

在遍历数组时用for方法,如果遍历对象用for-in,再次建议相对for-in来说,它会遍历出继承来的可枚举对象,所以更建议使用Obect.keys()方法

forEach

  • 按照索引的顺序按个传递给定义的一个函数,并且可以在原数组的基础上进行修改

    var arr=[1,2,4,5];
    arr.forEach(function(x,i,a){
        a[i] = x+1 
    }) ;
    
    // 其中调用函数中有三个参数,x 表示数组中元素,i 表示下标,a 表示数组本身
  • 回调过空位,并且保留空位

    var arr=[1,2,,,3,4];  
    arr.forEach(function(x,i,a){
        a[i] = x+1 
    });
    arr;  // [2, 3, , , 4, 5]

map()

  • 将调用的数组的每个元素传递给指定的函数,并返回一个新数组,且函数必须有返回值

    var arr=[1,2,3];
    arr.map(function(x){ 
        return x * x; 
    });
    arr;  // [1,4,9]
  • 如果是稀疏数组,返回的也是相同方式的稀疏数组;它具有相同的长度,相同的缺失元素;

filter()

  • 判断传递函数返回值是true还是falsetrue 表示此数组元素被添加到返回数组(新数组)中,false 则相反;
  • 返回一个新数组(通过逻辑判断的),并且返回的是稠密的数组

    [1,2,3].filter(function( x , i ,arr ){   
    return x<3;
    });  
    //  [1,2]
    
    // 其中三个参数和forEach表示的一样;
  • filter() 会跳过稀疏数组中缺少的元素,它的返回数组总是稠密的;
filter的两种用法:
  • 用来压缩稀疏数组

    var dense = sparse.filter(function(){
        return true; 
    });
  • 压缩空缺并删除undefined和null元素:

    a = a.filter(function(x){
        return x !==undefined && x !=unll; 
    });

every() / some()

两者都是通过对数组元素应用指定的函数进行判定,返回true或者false

  • every() 当且仅当针对数组中的所有元素通过判断都是true时,函数返回true,如果有一个为false,那么函数返回false
  • some() 当数组中有一个元素通过判断是true时,函数返回true;如果要返回false,必须所有元素都返回false才可以;

    [1,3,5].every(function(x){ 
    return x<8 ;
    });  
    // true  元素都返回true
    
    [1,2,4].some(function(x){ 
    return 4 % 4 === 0; 
    })  
    // true 有一个元素返回true
  • 两者都是确认返回什么值,它们就会停止遍历数组元素;
  • 在空数组上,every()返回true,some()返回 false

reduce()

  • 使用指定的函数将数组元素进行组合,生成单个值,有两个参数:
  • 第一个参数是执行化简的函数(化简函数就是用某种方法把两个值组合或化简为一个值,并返回化简后的值),第二个参数是一个传递给函数的初始值;

    var arr=[1,2,4];
    var brr=arr.reduce(function(res,x,i,arr){
        // 其中 res 表示每次化简后的值,x 表示数组元素,i 表示数组下标,arr 表示数组本身
        return res + x;
    },1);
    brr;  // 8

    其中1是初始值,初始值存在的时候,res首先赋初始值,x赋数组第一个元素,进行运算之后,res赋返回的值,x赋数组的第二个元素 ……,如果初始值不存在,那么resx 分别赋数组第一个和第二个元素,以此类推 ……;

  • 在空数组中,不带初始值参数调用reduce将会报错

    var arr=[];
    var brr=arr.reduce(function(res,x){
        return res+x;
    }); 
    // TypeError: Reduce of empty array with no initial value
  • 如果数组只有一个值且没有指定初始值,或者有一个空数组且指定一个初始值,reduce只会返回那个值,不会调用化简函数;

reduceRight()

  • 工作原理和reduce一样,不同的是它按照数组索引从高到低(从左到右)处理数组

for…of…遍历

暂无

    原文作者:listenWind
    原文地址: https://segmentfault.com/a/1190000011181785
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞