美文网首页
2021-11-22

2021-11-22

作者: 狗子吖 | 来源:发表于2021-11-22 15:59 被阅读0次

    数组方法

    方法列举

    • Foreach
    • Filter
    • Map
    • Every
    • Some
    • Reduce
    • ReduceRight

    Foreach 遍历并执行函数

        var personArr = [{name:'张三',sex:'m',age:18},
                        {name:'李四',sex:'m',age:28},
                        {name:'王二',sex:'f',age:22},
                        {name:'麻子',sex:'m',age:16}]
        personArr.forEach(function(ele, index,self){
            console.log(ele,index,self);
        });
    
    • forEach是数组原型上的方法,他接收两个参数,第一个参数是一个函数func,第二个参数用来调整this指向
    • foeEach方法会遍历数组personArr,并循环执行func,每次执行都会将personArr当前的元素、索引、和自身作为形参传给函数func

    实例

        var sla = [8000,9000,9822,10002];
        personArr.forEach(func,sla);
        function func(ele,index,self){
            ele.name += '先生';
            ele.sla = this[index];
        }
        console.log(personArr);
    

    运行结果

    foreach1.jpg
    • 通过forEach方法更改数组的属性,改变this指向之后操作数据更加方便
      源码仿写
        Array.prototype.myforEach = function(func){
            var _this = arguments[1] || window;
            var len = this.length;
            for(var i = 0;i < len; i++){
                func.apply(_this,[this[i],i,this]);
            }
            console.log('myforEach');
        }
    

    运行结果

    foreach2.jpg

    Filter 遍历筛选

    用法

        var teenager = personArr.filter(func);
    
        function func(ele,index,self){
            return ele.age < 18;//筛选出年龄小于18岁的ele
        }
        console.log('teenager',teenager);
    

    运行结果

    filter1.png
    1. filter方法与foreach方法一样也接收两个参数,一个是函数func,另一个用来改变this指向
    2. filter方法在遍历数组的同时,每访问一个元素ele就执行一次函数func
    3. filter方法在执行func函数的时候会将当前的元素ele,索引index,数组本身self【固定顺序】作为形参传给函数func
    4. filter方法会让函数func内部的this指向第二个参数
    5. func函数需要返回一个布尔类型的值
    6. filter方法会返回一个数组,数组里面的内容由func的返回值决定,如果func返回TRUE,那么当前访问的元素ele就会被加入到返回的数组中
      源码仿写
        Array.prototype.myFilter = function(func){
            var _this = arguments[1] || window;
            var arr = [];
            var len = this.length;
            for(var i = 0;i < len; i++){
                // if( func.apply(_this,[this[i],i,this]) ){
                //     arr.push(this[i]);
                // }
                func.apply(_this,[this[i],i,this]) && arr.push(this[i]);
            }
            return arr;
        }
    //调用myFilter
            var teenager1 = personArr.myFilter(func,[]);
            console.log('teenager1',teenager1);
    

    myFilter运行结果:

    filter2.png
    结果一样,仿写成功!
    filter1.png

    关于第二个参数改变func内部this指向的例子以后再补充

    Map 遍历映射

    用法

        var newArr = personArr.map(func,sla);
        function func(ele,index,self){
            ele.age += 10;//给每个元素的age属性+10
            ele.sla = this[index];//给每个元素添加属性sla,这里this指向传入的对象sla
            // console.log(ele,index,self,this);
            return ele;
        }
        console.log(newArr);
    

    运行结果

    map1.png
    1. map方法的参数和前面一样
    2. map方法会返回一个新数组,数组里面的元素是函数func的返回值
    3. map方法和foreach方法效果差不多,但是foreach是在原数组的基础上操作的,map方法不会改变原数组
      源码仿写
        Array.prototype.myMap = function(func){
            var _this = arguments[1] || window;
            var arr = [];
            var len = this.length;
            for(var i = 0;i < len;i ++){
                arr.push( func.apply(_this,[this[i],i,this]) );
                return arr;
            }
        }
        //调用myMap
        var newArr1 = personArr.myMap(func,sla);
        console.log('newArr1',newArr1);
    

    运行结果

    map2.png
    从结果可以看出map方法可以达到foreach方法一样的效果,并且myMap仿写成功

    Every

    作用
    判断数组中的元素是否都符合条件,都符合返回true,只要有一个不符合就返回false

    1. 参数【同上】
    2. 返回值 true/false
    3. func需要有一个返回值,在循环遍历数组的同时执行函数func,只要函数返回false,就不再遍历了,并且返回false
      用法
        function func(ele,index,self){
            console.log(ele,index,self);//查看函数接收到的形参具体是什么
        }
        //调用every方法,此时func没有返回值
        var flag = personArr.every(func);
        console.log('flag',flag);
    
    • 当函数没有设置返回值时,会默认返回undefined,every方法通过隐式类型转换判定为false,所以只执行一次便结束(只打印索引为0的元素和数组自身),返回false
      运行结果
      every1.jpg
        function func(ele,index,self){
            return ele.age > 20;//判断年龄是否大于20,是——返回true,不是返回false
        }
        //调用every方法,此时func有返回值
        var flag = personArr.every(func);
        console.log('flag',flag);
    

    运行结果

    every2.png

    源码仿写

    Array.prototype.myEvery = function(func){
        var _this = arguments[1] || window;
        var len = this.length;
        for(var i = 0;i < len;i ++){
            if( func.apply(_this,[this[i],i,this]) == false){
                return false;
            }   
        }
        return true;
    }
    var flag1 = personArr.myEvery(func);
    console.log('flag1',flag1);
    

    运行结果

    every3.png
    成功

    Some

    作用
    和every刚好相反,some是只要有一个符合要求就返回true,如果全都不符合要求才返回false

    1. 参数【同上】
    2. 返回值【同上】
      用法演示
    function func(ele,index,self){
        return ele.age < 20;
    }
    var flag = personArr.some(func);
    console.log('flag',flag);
    

    源码仿写

    Array.prototype.mySome = function (func){
        var _this = arguments[1] || window;
        var len = this.length;
        for(var i = 0;i < len; i ++){
            if( func.apply(_this,[this[i],i, this]) ){
                return true;
            }
        }
        return false;
    }
    //调用mySome方法
    var flag1 = personArr.some(func);
    console.log('flag1',flag);
    

    运行结果

    some.png
    可以看到函数func一样,但是结果与every相反

    Reduce

    作用
    传递一个初始值,该值将基于数组的元素进行一系列操作
    注释

    1. 参数:func和prevValue,这里与前面的方法有所不同,reduce方法会将第二个参数作为第一个参数传给func
    2. reduce方法传给函数func的参数:preValue|icurValue|index|self 总共四个,第二个和前面的ele等同
    3. 函数func最后也要返回prevValue,用来进行后续操作
    4. reduce方法会返回最终的prevValue

    用法

    var initName = '';
    
    var nameStr = personArr.reduce(func,initName);
    
    function func(prevValue,icurValue,index,self){
        prevValue += icurValue.name;//将所有元素的name值拼接成一个字符串
        return prevValue;
    }
    console.log('nameStr',nameStr);
    

    源码仿写

    Array.prototype.myReduce = function(func,initKey){
        var len = this.length;
        var prevValue = initKey;
        for(var i = 0; i < len; i++){
            prevValue = func(prevValue,this[i],i,this);
        }
        return prevValue;
    }
    //调用myReduce方法
    var nameStr1 = personArr.myReduce(func,initName);
    console.log('nameStr1',nameStr1);
    

    运行结果

    reduce.png

    应用

    var cookieStr = '_ga=GA1.2.475962636.1637567371; _gid=GA1.2.610551851; UM_distinctid=17d469f16eef0b; locale=zh-CN; read_mode=day; default_font=font2; Hm_lvt_0c0e9d9b1e7d617b3e6842e85b9fb068=1637567371; sensorsdata2015jssdkcross=%7B%22distinct'
    function getCookie(cookieStr){
        var cookieArr = cookieStr.split('; ');
        var cookieObj = {};
        return cookieArr.reduce(function(prevValue,icurValue,index,self){
            var arr = icurValue.split('=');
            prevValue[arr[0]] = arr[1];
            return prevValue;
        },cookieObj)
    }
    var cookieObj = getCookie(cookieStr);
    console.log(cookieObj);
    //使用原生reduce方法实现
    /**********************************************/
    //以下调用自己的方法myReduce实现
    var cookieObj = getCookie(cookieStr);
    console.log('原生Reduce',cookieObj);
    
    function getCookie1(cookieStr){
        var cookieArr = cookieStr.split('; ');
        var cookieObj = {};
        //此处使用myReduce
        return cookieArr.myReduce(function(prevValue,icurValue,index,self){
            var arr = icurValue.split('=');
            prevValue[arr[0]] = arr[1];
            return prevValue;
        },cookieObj)
    }
    var cookieObj1 = getCookie1(cookieStr);
    console.log('myReduce',cookieObj1);
    

    说明
    现在有一个字符串cookieStr,他是由多个'name=key'以'; '连接起来的,现在想要将cookieStr的内容转化成一个对象,以方便后续操作name和key

    • 使用myReduce方法的结果对比
      运行结果
      reduce1.png
      结果一样,说明仿写成功
      通过getCookie函数获得cookieObj
      通过cookieObj.name可以获得key值了
      如cookieObj.read_mode得到'day'
      reduce3.png

    ReduceRight

    相关文章

      网友评论

          本文标题:2021-11-22

          本文链接:https://www.haomeiwen.com/subject/ksebtrtx.html