【Python全栈-JavaScript】JavaScript-数组详解

JavaScript-数组详解

预热知识:对象遍历

1、定义对象,获取对象

var obj={
            a:1,
            b:2,
            c:3,
            d:function () {
                console.log("aa");
            }
        };

//        console.log(obj["a"]);
//        console.log(obj.a);
        obj.a=10;
        obj["a"]=10;    //可以传入动态的属性var mysttr = xxx;  obj[myattr]

        obj.d();
        obj["d"]();

2、for in 循环,复制对象


        *   for in 语句,遍历对象
        * */
        for(var prop in obj){
            console.log(prop,obj[prop]);        //prop 属性名  obj[prop] 属性值
        }

        //复制
        var obj1={};
        for(var key in obj){
            obj1[key]=obj[key];
        }
        obj.a=40;
        console.log(obj1,obj);  //obj1 和obj是两个独立的对象了

案例:设置div标签style属性

----------------------------------html
<div id="div0"></div>    

----------------------------------JavaScript
    
function setStyle(elem, style) {
        for (var prop in style) {
            elem.style[prop] = style[prop];
        }
    }

    var div0 = document.getElementById("div0");
    setStyle(div0, {
         "100px",
        height: "100px",
        backgroundColor: "red"
    });

另一种写法:

HTMLElement.prototype.addStyle = function (style) {
        for (var prop in style) {
            this.style[prop] = style[prop];
        }
    };

    div0.addStyle({
         "100px",
        height: "100px",
        backgroundColor: "red"
    })

一、数组基础

<body>
<div id="div0"></div>
<div id="div1"></div>
<div id="div2"></div>
<div id="div3"></div>
<div id="div4"></div>
    <script>
        /*
        *  数组是一种数据结构
        *  数组 将无序的数据做有序的排列,存储在一个变量中
        *  原生JS中没有数组类型(是继承的对象),原生JS中的数组可以存储多个不同类型的数据(弱类型)
        *  Array.isArray(arr) 判断arr是否是数组,区别不能用typeof判断是否是数组
        *
        *  数组中,标识元素所在的位置,叫做下标,也可以叫做索引
        *  数组中,标识元素的内容,arr[0]这个就叫做下标变量
        *
        * */
        /*for(var i=0;i<5;i++){
            var div=document.getElementById("div"+i);

        }*/

        var arr=[1,2,3,4,5];    //字面量创建

        var arr1=new Object([1,2,3,4]); //对象构造函数创建
//        console.log(typeof arr);
//        console.log(Array.isArray(arr));  //判断arr是否是数组,注意typeof arr  值是object

//        var arr2=[1,false,"a",{a:1,b:2}];     //这种类型不同的数据存储会造成数组操作时的效率降低

//        var arr2=new Array();     //构造函数创建;
//        var arr2=new Array(1,2,3,4);  //构造函数创建,也可以直接赋值(但不建议直接这样赋值);

        /*
        *   构造函数创建数组时,第一个参数
        *       如果第一个参数是数值类型并且构造函数中只有这一个参数,这个参数就是设置数组的长度,这个长度不能是小数或者负数,否则会报错
        *
        *   如果参数有2个或2个以上,那么第1个元素就不是数组的长度了,而是数组的第0个元素;如果第1参数不是数值类型,且仅有1个,也是作为数组的第0个元素
        *
        * */
        var arr2=new Array(4);      //4是长度,设置之后可以往里面加入的元素也可以不止4个
        console.log(arr2);


        var arr3=[];
//        0 就是下标
        arr3[0]=100;
        arr3[1]=200;
        console.log(arr3);

        var arr4=[];
        for(var i=0,j=0;i<100;i+=2,j++){
            arr4[j]=i;
        }
        console.log(arr4);


        var arr5=[];
        for(var k=0;k<5;k++){
            arr5[k]=document.getElementById("div"+k);
        }

        arr5[2].style.marginLeft="200px";

    </script>
</body>

二、数组长度

<script>
        /*
        *   length 数组的长度
        *  数组的长度是可以设置的
        *
        *  将数组的长度设置为0,表示清空数组
        *  如果数组的长度小于原数组长度,意味着将数组从0位截取到指定位置,后面的删除掉---> 用于做数组的截取
        * */
        var arr=[1,2,3,4,5];
       /* console.log(arr.length);
        arr.length=3;
        console.log(arr);*/

//       arr[arr.length-1]=6;   //将数组中最后一个元素5替换为6
        arr[arr.length]=6;   //给数组的尾部添加一个新元素6
        arr.a=100;
        /*
        *   使用for循环数组,只能循环数组的每个元素
        *   使用for in循环数组,不但可以循环数组的每个元素,还可以循环到他的属性
        *
        * */
        for(var i=0;i<arr.length;i++){
            console.log(arr[i]);
        }
        //for in  遍历到数组属性
        for(var prop in arr){
            console.log(arr[prop]);
        }

    </script>

案例:冒泡排序和选择排序

<script>
    window.onload = function () {
        /*冒泡排序*/
        var arr=[6,3,5,7,9,2,4,1,8];
        //外层从后往前
        for(var i=arr.length;i>0;i--){
            //内层从前往后
            for(var j=0;j<arr.length-1;j++){
                if(arr[j]>arr[j+1]){
                    var temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
            console.log("第"+i+"次循环:",arr);
        }
        console.log("--->",arr);

        /*选择排序*/
        var arr=[6,3,5,7,9,2,4,1,8];
        // 外层循环从头到尾
        for(var j=0;j<arr.length;j++){
            var min = j;    //每次初始最小值是当前外层循环所在值
            // 从当前所在值的下一项到尾部循环
            for(var i=j+1;i<arr.length;i++){
                if(arr[i]<arr[min]){
                    var temp = arr[min];
                    arr[min] = arr[i];
                    arr[i] = temp;
                }
            }
            console.log("第"+j+"次循环:",arr);
        }
        console.log(arr);
    };
</script>
View Code

三、数组和对象

<script>
        var arr=[1,2,3,4,5];
        var obj={a:1,b:2,c:3};
       /* var arr1=arr; //将arr的地址赋给arr1
        arr[0]=40;
        console.log(arr1);  //[40,2,3,4,5] */

    //深复制一个数组
    /*   var arr1=[];
       for(var i=0;i<arr.length;i++){
           arr1[i]=arr[i];
       }
       arr[0]=40;
        console.log(arr1);*/


//        var str=arr.toString();
//        var str=obj.toString();    //错误[object object]
        /*var str="";
        for(var prop in obj){
            str+=prop+"="+obj[prop]+"&"
        }
        console.log(str);*/


//        将对象转换为JSON字符串
        var str=JSON.stringify(obj);
//        将JSON字符串逆转回对象
        var obj1=JSON.parse(str);
        obj.a=20;
        console.log(obj1);


        var str1=JSON.stringify(arr);
        var arr1=JSON.parse(str1);
        arr[0]=40;
        console.log(arr1);


        var objs={
            a:1,
            b:{
                a:1,
                b:{
                    a:1,
                    b:{
                        a:1
                    }
                }
            }
        };
        /*var obj2={};
        for(var prop in objs){
            obj2[prop]=objs[prop];
        }
        objs.b.a=10;*/
        /*
        *   利用JSON转换可以深复制
        *
        * */
        /*var obj2=JSON.parse(JSON.stringify(objs));
        objs.b.b.a=10;
        console.log(obj2);*/


        console.log("b" in obj);//属性名是否在对象下
       /* if("b" in obj){

        }*/
//       数组中是否有该下标(索引),不是值
       console.log(5 in arr);   //false
       console.log(3 in arr);   //true
    </script>

 四、数组的方法-push()  pop()  shift()  unshift()

var arr=[-2,-1,0,1,2,3,4,5];
//        var len=arr.push();//返回数组的新长度
//        len=arr.push(6);//[1,2,3,4,5,6],6;
//       var len=arr.push(6,7,8);//[1,2,3,4,5,6,7,8],8;
//       var len=arr.push([6,7,8]);//[1,2,3,4,5,[6,7,8]],6;

      //数组首端入栈,返回新数组长度
//        var len=arr.unshift();
//        var len=arr.unshift(0);
//        var len=arr.unshift(-2,-1,0);
        /*
        *  减少使用unshift   ,unshift会将原来数组的所有项向后移动一位 因此效率非常低
        * */
//        console.log(len,arr);

//        删除数组尾部的元素
//        var t=arr.pop();  //返回被删除的元素
//        console.log(t);
        /*var arr1=[];
        var t;
        while (t=arr.pop()){
            arr1.push(t);
        }
        console.log(arr1,arr);*/

//        删除数组的头部元素
//        var t=arr.shift();//返回被删除的元素

作业1.随机生成一个5位以内的数,然后输出该数共有多少位,每位分别是什么

var arr1=[];
        var bool=false;
        for(var i=0;i<4;i++){
            var s=parseInt(Math.random()*10);   //随机生成0-9
            if(s===0 && !bool) continue;    //第一位不能是0
            arr1.push(s);
            bool=true;
        }
        var num=Number(arr1.join(""));
        console.log(arr1,arr1.length,num)
随机生产4位数

 五、数组转化为字符串join()  ,  连接数组concat()

<script>
        var arr=[1,2,3,4];
//        console.log(arr.join());  //arr.toString()相同
//        console.log(arr.join("#"));   //设置一个符号,用这个符号链接数组的每个元素,形成新字符串
//        console.log(arr.join(""));    //元素紧密相连,中间没有分割


//        var arr1=arr.concat();    //没有参数时,是复制数组
//        arr[0]=10;  //arr1=[1,2,3,4]
//        var arr1=arr.concat(5,6); //将arr数组链接,5,6两个元素,形成新数组,原数组不变
//        var arr1=arr.concat([5,6,7]); //将arr数组和数组[5,6,7]合并形成新数组
        var arr2=[7,8,9];
        var arr1=arr.concat(arr2);  //将两个数组链接形成新数组
        console.log(arr1,arr);

    </script>

六、截取数组 splice()   slice()

<script>
        var arr=[1,2,3,4,5];

//        arr.splice();  数组插入删除替换元素,并且返回被删除元素组合新数组
//        arr.splice();//创建一个新的空数组返回
//        var arr1=arr.splice(3);//从下标是3开始删除到尾部
//        var arr1=arr.splice(0);//将arr的所有元素导入到arr1中.清空arr
//        var arr1=arr.splice(0,2);//从arr数组的下标0开始删除2位元素
//        var arr1=arr.splice(0,0,-1);//在第0位插入一个-1;
//        var arr1=arr.splice(-1,0,-1);//在第-1位(倒数第1位)插入一个-1;
//        var arr1=arr.splice(arr.length,0,-1);//在尾部插入一个-1
//        var arr1=arr.splice(1,2,-1,-2);//从第1位开始替换两个元素为-1,-2
//        console.log(arr1,arr);

        //去重
        var arr1=[1,3,5,2,1,4,3,1,2,5,3,1,2,1];
        /*
        * 数组删除元素后,数组的长度会发生改变
        *
        * */
       /* for(var i=0;i<arr1.length;i++){
            for(var j=i+1;j<arr1.length;j++){
                if(arr1[i]===arr1[j]){
                    arr1.splice(j,1);
                }
            }
        }
        console.log(arr1)*/


       // arr.slice(); 数组截取元素,返回被截取的新元素,原数组不改变
       // var arr2=arr.slice();//复制arr的所有元素给arr2,没有引用关系
       // var arr2=arr.slice(0);//复制arr的所有元素给arr2,没有引用关系
       // var arr2=arr.slice(3);//将数组从下标3开始到结尾截取形成新数组
       // var arr2=arr.slice(-2);//将数组从倒数第2位开始到结尾截取形成新数组
       // var arr2=arr.slice(3,4);//将数组从下标3开始到下标4截取形成新数组
       // var arr2=arr.slice(-2,4);//将数组从倒数第2位开始到下标4截取形成新数组
       // var arr2=arr.slice(-2,-1);//将数组从倒数第2位开始到倒数第1位截取形成新数组
       // console.log(arr2,arr);

        var div=document.getElementsByTagName("div");
        // div.pop();  //报错,Uncaught TypeError: div.pop is not a function
        console.log(div);       //HTMLCollection(7) [div, div, div, div, div, div, div]  是一个类似数组的对象,但是不是数组故不能使用数组的方法
        var arr2=Array.prototype.slice.call(div);    //将非数组元素转换为数组
        console.log(arr2);  //(7) [div, div, div, div, div, div, div]
        arr2.pop();     //转换为数组之后 可以使用 数组方法了
        console.log(arr2);  //(6) [div, div, div, div, div, div]
    </script>

七、indexOf()    lastindexOf()  查找内容

查找列表中的是否含有某项,有返回下标,没有返回-1。arr.indexOf()  arr.lastIndexOf()

<script>
        var arr=[1,2,3,4,5,6,2,9,10,2];
//        arr.indexOf();
       /* 在数组中查找元素,可以根据第二个参数的起始位置开始查找,
            返回查找到元素的下标,如果没有找到返回-1*/

//       console.log(arr.indexOf(2));//从下标0开始向后查找2
//       console.log(arr.indexOf(2,2)); //从下标2开始向后查找2

        //找到arr所有的2
        var index=-1;
        while (arr.indexOf(2,index+1)>-1){
            index=arr.indexOf(2,index+1);
            console.log(index);
        }

//       arr.lastIndexOf(2);//从后向前搜索,查找到元素的下标返回
    </script>

 八、倒序reverse() 和 排序sort()

倒序reverse() 

    /*
    *  reverse 倒序
    * 原数组倒序改变,返回的新数组和原数组是引用关系
    *
    * */
    var arr = [2, 3, 5, 7, 9, 1, 4, 6, 8, 10];
    // var arr1 = arr.reverse();    //
    // console.log(arr, arr === arr1);  //true,arr1和arr是引用关系

排序sort()

 /*
    *  sort();
    *  排序数组中的元素,原数组发生改变,返回的新数组和原数组是引用关系
    *  sort(function(a,b){})
    * */
    // var arr1 = arr.sort();
    // console.log(arr,arr1===arr);    //[1, 10, 2, 3, 4, 5, 6, 7, 8, 9] true  按位进行排序

    /*由小到大排序*/
    /*arr.sort(function (pre,next) {
        return pre-next;
    });*/
    /*由大到小排序*/
    /*arr.sort(function (pre,next) {
        return next-pre;
    });*/
    //console.log(arr);

案例演示:

《1》随机生成data属性num对应的值,按照num从小到大排序

/*// 随机生成data属性num对应的值,按照num从小到大排序
      var data=[
          {id:1001,icon:"img/1.png",name:"餐饮0",num:1,price:10},
          {id:1002,icon:"img/2.png",name:"餐饮1",num:1,price:20},
          {id:1003,icon:"img/3.png",name:"餐饮2",num:1,price:30},
          {id:1004,icon:"img/4.png",name:"餐饮3",num:1,price:40},
          {id:1005,icon:"img/5.png",name:"餐饮4",num:1,price:50},
          {id:1006,icon:"img/6.png",name:"餐饮5",num:1,price:60},
          {id:1007,icon:"img/7.png",name:"餐饮6",num:1,price:70},
          {id:1008,icon:"img/8.png",name:"餐饮7",num:1,price:80},
          {id:1009,icon:"img/9.png",name:"餐饮8",num:1,price:90},
          {id:1010,icon:"img/10.png",name:"餐饮9",num:1,price:100}
      ];

      for(var i=0;i<data.length;i++){
          data[i].num=parseInt(Math.random()*8+2);  //随机 2-8
      }

      data.sort(function (pre,next) {
          return pre.num-next.num;
      });
      console.log(data);*/

《2-1》普通的随机,输出0-100之间 不重复的4个数

/*var arr2 = [];

    // 普通的随机,输出0-100之间 不重复的4个数
     while (arr2.length<4){
          var num=parseInt(Math.random()*100);
          if(arr2.indexOf(num)===-1){
              arr2.push(num);
          }
    }
    console.log(arr2);*/

《2-2》排序的随机乱序

/*
    排序的随机乱序
    for(var i=0;i<100;i++){
        arr2.push(i);    //[0,1,2,3 ....99]   
     }      
     arr2.sort(function () {
         return Math.random()-0.5;  //-0.5~0.5  (负数从小到大排序,正数从大到小)
     });
     arr2.length=4;     //取数组的前四个
     console.log(arr2);*/

《3》抽奖:一等奖1个,二等奖2个,三等奖3个,四等奖4个,五等奖5个

《4》生成4位数字 字母混合的验证码

var str = "azAZ";

    /* //拼音字符和汉字排序
    console.log(str.charCodeAt(0));     //a对应的ascii数值为 97
     console.log("一".charCodeAt(0).toString(16));   //一 对应的ascii数值 转化为十六进制
     var arr3=["xietian","wangzheng","xuli","zhangxueyou"];
     arr3.sort(function (pre,next) {
         return pre.charCodeAt(0)-next.charCodeAt(0);   //首字母从小到大排序
     });
     console.log(arr3);*/

    /*console.log(String.fromCharCode(97));     //a ,将ASCII上十进制数97 转化为对应字符
    console.log(String.fromCharCode(0x4e00));*/


    /*
    生成4位数字 字母混合的验证码
    *  a--97
    *  z--122
    *
    *  A-65
    *  Z-90
    * */
    //    console.log(str.charCodeAt(3));
    var arr3 = [];
    for (var i = 0; i < 123; i++) {
        if (i < 10) {
            arr3.push(i);
            continue;
        }
        if (i < 65) continue;
        if (i < 91) {
            arr3.push(String.fromCharCode(i));
            continue;
        }
        if (i < 97) continue;
        arr3.push(String.fromCharCode(i));
    }
    // arr3 为:
    //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
    // "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
    console.log(arr3);
    arr3.sort(function () {
        //将生成的4位验证码 乱序
        return Math.random() - 0.5;
    });
    console.log(arr3);
    arr3.length = 4;        //取出乱序后的数组的前4位
    console.log(arr3);
    console.log(arr3.join(""));

    // 面试问题:手机APP注册时 验证码一般是接入的一些收费的验证码API平台,如创蓝253 https://zz.253.com/v5.html#/yun/sms_y?did=232

 九、遍历的多种玩法

(1)forEach()

/*var arr=[1,2,4,6,7,8,5,9];
        arr.forEach(function (item,index,arr) {
            console.log(item,index,arr);
        })*/

// item是数组每一项,index是数组下标,arr是该数组

案例和知识点演示:

/*
       修改产品的数量随机,求出每个产品的总价
       var data=[
           {id:1001,icon:"img/1.png",name:"餐饮0",num:1,price:10},
           {id:1002,icon:"img/2.png",name:"餐饮1",num:1,price:20},
           {id:1003,icon:"img/3.png",name:"餐饮2",num:1,price:30},
           {id:1004,icon:"img/4.png",name:"餐饮3",num:1,price:40},
           {id:1005,icon:"img/5.png",name:"餐饮4",num:1,price:50},
           {id:1006,icon:"img/6.png",name:"餐饮5",num:1,price:60},
           {id:1007,icon:"img/7.png",name:"餐饮6",num:1,price:70},
           {id:1008,icon:"img/8.png",name:"餐饮7",num:1,price:80},
           {id:1009,icon:"img/9.png",name:"餐饮8",num:1,price:90},
           {id:1010,icon:"img/10.png",name:"餐饮9",num:1,price:100}
       ];
       data.forEach(function (item) {
            item.num=parseInt(Math.random()*9+1);
            item.sum=item.num*item.price;
       });
        console.log(data);*/


       /*
      // 修改数组中的每个值
         var arr=[1,2,4,6,7,8,5,9];
             arr.forEach(function (t,i,arr) {
      //           t++;     //错误
      //           arr[i]++;    //数组中每一项

      //           将所有偶数+1
                 if(t%2===0){
                     arr[i]++;
                 }
             });
          console.log(arr);*/

(2)map()遍历

//map()遍历
      //  var arr=[1,2,4,6,7,8,5,9];
       // arr.map(function (t) {
       //
       // })

/* map()与forEach相似,可以完成forEach的所有功能
       var data=[
           {id:1001,icon:"img/1.png",name:"餐饮0",num:1,price:10},
           {id:1002,icon:"img/2.png",name:"餐饮1",num:1,price:20},
           {id:1003,icon:"img/3.png",name:"餐饮2",num:1,price:30},
           {id:1004,icon:"img/4.png",name:"餐饮3",num:1,price:40},
           {id:1005,icon:"img/5.png",name:"餐饮4",num:1,price:50},
           {id:1006,icon:"img/6.png",name:"餐饮5",num:1,price:60},
           {id:1007,icon:"img/7.png",name:"餐饮6",num:1,price:70},
           {id:1008,icon:"img/8.png",name:"餐饮7",num:1,price:80},
           {id:1009,icon:"img/9.png",name:"餐饮8",num:1,price:90},
           {id:1010,icon:"img/10.png",name:"餐饮9",num:1,price:100}
       ];
       data.map(function (item) {
           item.num=parseInt(Math.random()*9+1);
           item.sum=item.num*item.price;
       });
       console.log(data);*/

      // 每个元素+1,返回给新数组
      var arr=[1,2,4,6,7,8,5,9];
       var arr1=arr.map(function (t) {
            return ++t;
       });
        console.log(arr,arr1);

     /*
    return 返回数据元素,到新数组中,如果不返回的数据就会变成undefined
     var arr=[1,2,4,6,7,8,5,9];
       arr=arr.map(function (t) {
           if(t%2===0){
               return t+1;
           }
           return t;      //如果没有这句,非奇数的返回为undefined
       });
        console.log(arr);*/

总结 map() 和 forEach() 的区别

/*  map() 和 forEach() 的区别
     *   forEach遍历当前数组,没有返回值,不会返回新数组
     *   map遍历当前数组,并且将当前数组中的元素返回给新数组,
     * 不使用return时,新数组的长度与原数组相同,但是每个元素都是undefined;
     * */

十、some()  every()  filter()  reduce()

《1》some()方法

定义和用法:

some() 方法用于检测数组中是否存在满足条件的项(函数提供)。

some() 方法会依次执行数组的每个元素:

  • 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
  • 如果没有满足条件的元素,则返回false。

注意: some() 不会对空数组进行检测。

注意: some() 不会改变原始数组。

语法:array.some(function(currentValue,index,arr),thisValue)

 

案例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>

<p>点击按钮检测数组中是否有元素大于输入框中输入的数字。</p>
<p>最小年龄: <input type="number" id="ageToCheck" value="18"></p>
<button onclick="myFunction()">点我</button>
<p>判断结果: <span id="demo"></span></p>
<script>
var ages = [4, 12, 16, 20];
function checkAdult(age) {
    return age >= document.getElementById("ageToCheck").value;
}
function myFunction() {
    document.getElementById("demo").innerHTML = ages.some(checkAdult);
}
</script>

</body>
</html>
some()

参考:https://www.runoob.com/jsref/jsref-some.html

《2》every方法

定义和用法:

every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。

every() 方法使用指定函数检测数组中的所有元素:

  • 如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
  • 如果所有元素都满足条件,则返回 true。

注意: every() 不会对空数组进行检测。

注意: every() 不会改变原始数组。

语法:array.every(function(currentValue,index,arr), thisValue)

案例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>

<p>点击按钮检测数组的所有元素是否都大于输入框中指定的数字。</p>
<p>最小年龄: <input type="number" id="ageToCheck" value="18"></p>
<button onclick="myFunction()">点我</button>
<p>是否所有年龄都符号条件? <span id="demo"></span></p>
<script>
var ages = [32, 33, 12, 40];
function checkAdult(age) {
    return age >= document.getElementById("ageToCheck").value;
}
function myFunction() {
    document.getElementById("demo").innerHTML = ages.every(checkAdult);
}
</script>

</body>
</html>
every()

《3》filter()方法

定义和用法:

filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素

注意: filter() 不会对空数组进行检测。

注意: filter() 不会改变原始数组。

语法:array.filter(function(currentValue,index,arr), thisValue)

案例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>

<p>点击按钮返回数组 ages 中所有元素都大于输入框指定数值的元素。</p>
<p>最小年龄: <input type="number" id="ageToCheck" value="18"></p>
<button onclick="myFunction()">点我</button>
<p>所有大于指定数组的元素有? <span id="demo"></span></p>
<script>
var ages = [32, 33, 12, 40];
function checkAdult(age) {
    return age >= document.getElementById("ageToCheck").value;
}
function myFunction() {
    document.getElementById("demo").innerHTML = ages.filter(checkAdult);
}
</script>

</body>
</html>
filter()

参考:https://www.runoob.com/jsref/jsref-filter.html

《4》reduce() 方法

定义和用法:

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值

reduce() 可以作为一个高阶函数,用于函数的 compose。

注意: reduce() 对于空数组是不会执行回调函数的。

语法:array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

案例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>

<p>点击按钮后对数组元素进行四舍五入并计算总和。</p>
<button onclick="myFunction()">点我</button>

<p>数组元素之和: <span id="demo"></span></p>

<script>
var numbers = [15.5, 2.3, 1.1, 4.7];

function getSum(total, num) {
    return total + Math.round(num);
}
function myFunction(item) {
    document.getElementById("demo").innerHTML = numbers.reduce(getSum, 0);
}
</script>

</body>
</html>
reduce()

视频学习笔记:

<script>
    var arr = [1, 2, 4, 6, 7, 8, 5, 9];
    /*      var bool=arr.some(function (t) {
  //            判断所有元素是否有满足该条件的,
  // 如果遇到一次满足则不再继续判断,直接返回true,否则返回false
              return t>10;
          });
          console.log(bool);*/
    //    some()方法的应用:作为if的判断条件
    //    判断数组中是否有大于5的值
    /* if(arr.some(function (t) { return t>5 })){

     }*/

    /*// 查询对象型数组是否有符合条件的元素
    var data=[
        {id:1001,icon:"img/1.png",name:"餐饮0",num:1,price:10},
        {id:1002,icon:"img/2.png",name:"餐饮1",num:1,price:20},
        {id:1003,icon:"img/3.png",name:"餐饮2",num:1,price:30},
        {id:1004,icon:"img/4.png",name:"餐饮3",num:1,price:40},
        {id:1005,icon:"img/5.png",name:"餐饮4",num:1,price:50},
        {id:1006,icon:"img/6.png",name:"餐饮5",num:1,price:60},
        {id:1007,icon:"img/7.png",name:"餐饮6",num:1,price:70},
        {id:1008,icon:"img/8.png",name:"餐饮7",num:1,price:80},
        {id:1009,icon:"img/9.png",name:"餐饮8",num:1,price:90},
        {id:1010,icon:"img/10.png",name:"餐饮9",num:1,price:100}
    ];
    if(data.some(function (t) { return t.id===1005 })){
        console.log("有");
    }*/


    // 判断数组中每一个是否满足条件,如果全部都满足,就返回true,否则返回false
    var bool = arr.every(function (t) {
        return t > 0;
    });
    console.log(bool);      //true ,数组中所有元素都大于0


    /*
    *   filter过滤筛选
    array.filter(function(currentValue,index,arr), thisValue)
    *  不修改原数组,返回的满足条件的新数组
    * */
    /* var arr1=arr.filter(function (t) {
         t++;
         return t>5;//返回的任然是原元素
     });
     console.log(arr1,arr);*/

    /*var data=[
        {id:1001,icon:"img/1.png",name:"餐饮0",num:1,price:10},
        {id:1002,icon:"img/2.png",name:"餐饮1",num:1,price:20},
        {id:1003,icon:"img/3.png",name:"餐饮2",num:1,price:30},
        {id:1004,icon:"img/4.png",name:"餐饮3",num:1,price:40},
        {id:1005,icon:"img/5.png",name:"餐饮4",num:1,price:50},
        {id:1006,icon:"img/6.png",name:"餐饮5",num:1,price:60},
        {id:1007,icon:"img/7.png",name:"餐饮6",num:1,price:70},
        {id:1008,icon:"img/8.png",name:"餐饮7",num:1,price:80},
        {id:1009,icon:"img/9.png",name:"餐饮8",num:1,price:90},
        {id:1010,icon:"img/10.png",name:"餐饮9",num:1,price:100}
    ];
    data.forEach(function (t) {
        t.selected=Math.random()*2+1<2;
    });
    // 过滤data属性selected为true的项
    data2 = data.filter(function (t) {
        return t.selected
    });
    console.log(data2,data);    //data 不变
    /!*
    *  判断是否每个元素都被选中
    * *!/
    // if(data.length===data.filter(function (t) { return t.selected }).length){
    //
    // }*/


    /*  reduce()方法
    array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
    *  如果没有initValue值,sum就是第0项的值,item就是第一项值,所以index是从1开始
    *一般用于 求和 求阶乘运算
    * */
    // arr是实例.动态方法
    /* var s=arr.reduce(function (sum,item,index) {
         console.log(sum,item,index);
         return sum+item;
     },-10); //这里第二个参数是initValue初始值,如果设置这个初始值,index就从0开始,sum开始就是-10
     console.log(s);*/


    //        Array是类名:类别的名称
    //       Array.isArray();       //静态方法
    //       Array.from();     //ES6的方法

    //        Array.prototype.slice.call(div);      //(ES5)
    //        Array.from(div);  //将类数组转换为数组(ES6)

</script>
some() every() filter() reduce() Array.isArray() Array.from()

十一、函数arguments参数与数组方法的结合

一般的函数传参必须一一对应

// *  参数如果写在所有参数的最前面,那就是必要参数
    // *  ES5中所有的参数一般都需要按位置填写,如果没有填写,就会变成undefined
    // *  多填进入的参数值不会被直接获取到
    // *
    /* function fn1(a,b,c) {
         console.log(a,b,c);
     }
     fn1(null,3,4,10,20);*/

arguments可以传入不定参数

/*function max() {
        console.log(arguments);     //函数中就可以获取这个arguments
        var arr = Array.from(arguments);        //将传入的参数 转化为一个数组
        return arr.reduce(function (p1, p2) {
            return p1 > p2 ? p1 : p2;
        });
    }

    console.log(max(1, 2, 3, 5, 7, 9, 1, 2, 5));
    console.log(max(3, 6, 8, 20, 10));*/

arguments的属性

function fn2() {
        console.log(arguments);
        console.log(Array.from(arguments));
        console.log(arguments.callee.a);
        console.log(arguments.callee);      //arguments.callee 当前执行的函数
        console.log(arguments.callee.caller);   //回调当前函数的父级函数
    }

    fn2.a = 10;

    // fn2(3,4,6,7);
    function fn3(fn) {
        fn(3,6,4,7);
    }
    fn3(fn2);

 十二、Math函数

Math常量

案例1:轮播图

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>轮播图</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        #rollImg{
             1280px;
            height: 426px;
            margin: auto;
            position: relative;
            overflow: hidden;
        }
        #imgCon{
             6400px;
            height: 426px;
            transition: all 1s;
            font-size: 0;       /*消除图片之间空格*/
            position: absolute;
            left: 0;
        }
        #imgCon img{
             1280px;
            height: 426px;
        }
        #leftBtn{
            position: absolute;
            top: 200px;
            left: 0;
        }
        #rightBtn{
            position: absolute;
            top: 200px;
            right: 0;
        }
        #dotControl{
            list-style: none;
            position: absolute;
            left: 500px;
            bottom: 10px;
        }
        #dotControl li{
             16px;
            height: 16px;
            border: 2px solid red;
            border-radius: 8px;
            float: left;
            margin-left: 10px;
            background-color: rgba(255,0,0,0.5);
        }
    </style>
</head>
<body>
<div id="rollImg">
    <div id="imgCon">
        <img src="img/a.jpeg">
        <img src="img/b.jpeg">
        <img src="img/c.jpeg">
        <img src="img/d.jpeg">
        <img src="img/e.jpeg">
    </div>
    <ul id="dotControl">
        <!-- 根据img个数动态生成小圆点-->
        <!--<li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>-->
    </ul>
    <img id="leftBtn" src="img/left.png">
    <img id="rightBtn" src="img/right.png">
</div>
</body>
<script>
    var $imgCon,leftbtn,rightbtn,$dotControl,liList;
    var position = 0;
    init();

    function init() {
        $imgCon = document.querySelector("#imgCon");
        $dotControl = document.querySelector("#dotControl");
        leftbtn = document.querySelector("#leftBtn");
        rightbtn = document.querySelector("#rightBtn");
        // 根据图片个数创建小圆点,并添加事件
        imgs = $imgCon.querySelectorAll('img');
        for(var i=0;i<imgs.length;i++){
            node = document.createElement("li");
            $dotControl.appendChild(node);
            //给每个li节点添加点击事件
            node.addEventListener('click',liClickHandler);
        }
        liList = document.querySelectorAll("#dotControl li");
        liList[0].style.backgroundColor="blue";
        //给前进后退按钮添加点击事件
        leftBtn.addEventListener('click',clickHandler);
        rightBtn.addEventListener('click',clickHandler);
    }
    function liClickHandler(e) {
        position = Array.from(liList).indexOf(this);
        imgConMove();
    }
    function clickHandler() {
        if(this ===leftbtn){
            position--;
            if(position<0){position=4}
            imgConMove();
            return;
        }
        position++;
        if(position>4){position=0}
        imgConMove();
    }
    function imgConMove() {
        $imgCon.style.left = -1280*position+"px";
        console.log(liList[position]);

        liList.forEach(function (item,index) {
            if(index===position){
                item.style.backgroundColor="blue";
            }else{
                item.style.backgroundColor="rgba(0,0,0,0)";
            }

        })
    }
</script>
</html>
轮播图

 

原文地址:https://www.cnblogs.com/XJT2018/p/11073310.html