数组的一些语法,数组塌陷

273 阅读10分钟

数组语法

push

        -   语法: `数组名.push(数据)`
        -   作用: 向数组末尾添加数据
        -   返回值: 追加数据后, 数组最新的长度
        -    push不但可以添加一个元素,还可以添加多个元素
          var arr = [1, 2, 3]

             数组名.push(数据)
             var len = arr.push(100)
             console.log(arr)
             console.log('返回值: ', len)
             
     用法 var arr=["a","b","c","d","e","f"];
      // 给数组的尾部插入数组的长度(length)
         arr.push(arr.push());
         console.log(arr); // ['a', 'b', 'c', 'd', 'e', 'f', 6]
    /**
     *  手动模拟 push
     *      作用: 向数组末尾 新增一条数据
    */

    function push(push_arr, data) {
        /**
         *  
         *      在 函数传参的过程中, 如果实参的值是一个引用数据类型
         *      然后在函数内部 对这个形参 做了一些修改
         *      那么会影响到 函数外边的 原数据
         * 
         *  在当前案例中
         *      在 函数传参的过程中, 传递了一个 引用数据类型 arr 和一个基本数据类型 100
         *      然后在函数内部 对形参 push_arr 做了一些修改
         *      然后此时的修改会影响 函数外部的原数据 也就是 会影响到 数组 arr
         * 
         * 
        */
        push_arr[push_arr.length] = data

        return push_arr.length
    }

    push(arr, true)  //增加 true
    push(arr, 100)  
    push(arr, 'QF001')
    console.log(arr)  // 一次性打印
        

- pop

        -   语法: `数组名.pop()`
        -   作用:它没有参数,删除数组的最后一项元素,并且将这个被删除的元素返回
        -   返回值: 被删除的数据

- unshift

        -   语法: `数组名.unshift(数据)`
        -   作用: 向数组的头部添加一个或者多个元素,并且返回一个新数组的长度
        -   返回值: 添加数据后, 数组最新的长度
        
          var arr=["a","b","c","d","e","f"];
            // 把尾部的元素插在数组的头部
              arr.unshift(arr.pop());
              console.log(arr) //  ['f', 'a', 'b', 'c', 'd', 'e']
           

- shift

        -   语法: `数组名.shift()`
        -   作用: 删除数组下标0数据
        -   返回值: 被删除的数据

at

   // push unshift 改变原数组,并且返回一个新长度,返回值的类型是数值型
   // pop shift  改变原数组,并且返回一个元素,数组中删除的原数组类型
   // at  获取数组中对应下标的元素 允许使用负数,负数从后向前获取 
   // 不改变数组,返回一个元素,数组中对应下标的元素类型

            var arr=["a","b","c","d","e"];
            console.log(arr.at(0))
            console.log(arr.at(1))
            从后向前获取
            console.log(arr.at(-1)) //最后的下标元素“e"
           

- reverse

    -   语法: `数组名.reverse()`
    -   作用: 反转数组
    -   返回值: 反转后的数组

- sort

     *      语法1: 数组名.sort()
     *      作用: 将数组内的数据, 转换为 字符串, 然后一位一位的对比
     *
     *      语法2: 数组名.sort(function (a, b) { return a - b })
     *      作用:   会按照数字的 从小到大
     *
     *      语法3: 数组名.sort(function (a, b) { return b - a })
     *      作用:   和 语法2相反, 从大到小
     *
     *      返回值: 返回一个排序好的数组
     *
     *      注意: sort 使用后能够修改原数组
        -   不传参数: 会将数据转换为字符串后, 一位一位的对比
        -   回调函数内进行 a - b, 那么会按照数字大小升序排序
        -   回调函数内进行 b - a, 那么会按照数字大小降序排序
    -   作用: 根据参数对数组数据实现排序
    -   返回值: 排序后的数组
    

- splice

    -   语法: `数组名.splice(开始索引, 多少个); 
        数组名.splice(开始索引, 多少个, 插入数据1, 插入数据2, ...)`
    //改变原数组,并且返回一个由被删除元素组成的新数组 
    // 插入、删除、替换
    // 1、可以删除指定位置的一个或者多个元素
    // 2、可以用在指定位置添加一个或者多个元素
    // 3、用来替换数组中某个位置开始到某个位置结束的元素为其他元素
  //    var arr = [1, 2, 3, 4, 5]
            下标   0  1  2  3  4

     语法1
     arr.splice(0, 3)    // 从 [0] 开始, 剪切 3 个
     console.log(arr)
     var res = arr.splice(0, 3)
     console.log('剪切到的内容: ', res)
     console.log('剪切后的数组: ', arr)


    // 语法2
    arr.splice(0, 3, '新加入的数据1', true, undefined, { name: '张三' }, [1, 2, 3])
    console.log('剪切后的数组: ', arr)
    
      var arr=["a","b","c","d","e","f"];
     插入
     var arr1=arr.splice(2,0,"0");//在b和c之间插入一个0
     console.log(arr,arr1);
     arr 原数组  ['a', 'b', '0', 'c', 'd', 'e', 'f'] 
     arr1 重组的数组 []
    var arr1=arr.splice(4,0,"1","2","3");//在e前面插入1,2,3
 console.log(arr,arr1);// ['a', 'b', 'c', 'd', '1', '2', '3', 'e', 'f'][]

    插入在数组的头部 unshift
    var arr1=arr.splice(0,0,"0","1","2");
    console.log(arr1,arr);

    插入在数组的尾部 push
    var arr1=arr.splice(arr.length,0,"0","1","2");
    console.log(arr)

     var arr=["a","b","c","d","e","f"];
     // 替换
     var arr1=arr.splice(2,2,"1","2");//将数组中cd替换为12
     console.log(arr1,arr);
    arr1['c', 'd']  
    arr  : ['a', 'b', '1', '2', 'e', 'f']
    
     var arr1=arr.splice(-1,1,"1","2","3");
     console.log(arr1,arr);
     arr1 : ['f']
     arr :  ['a', 'b', 'c', 'd', 'e', '1', '2', '3']
     
     var arr1=arr.splice(); // 什么也没删除返回一个空数组
     console.log(arr1); // []
     
    // 将数组里的所有元素转移到另一个数组中 也就是给原数组清空
     var arr1=arr.splice(0);
     console.log(arr1,arr);

    //将数组的最中间的元素删除,并且获取到这个被删除的元素
    var item=arr.splice(~~(arr.length/2),1)[0]
    console.log(item);

splice 数组去重

        var arr=[1,2,4,2,4,1,2,5,2,5,1,1,2,4];


    // 改变原数组

    // 第一次外层循环取到一个1,内层循环从这个1后面的元素开始循环到尾部
     for(var i=0;i<arr.length;i++){
         for(var j=i+1;j<arr.length;){
            // console.log(j);

    //         // arr[i] 外层的这个元素 1  第一次外层为1时,
                      循环内层删除了下标是5 10 11的这三个1
    //         // arr[i] 外层这个元素 2 第二次外层为2时,循环内层,删除所有2
    //         // ...
             if(arr[i]===arr[j]){
                // 当 删除下标5上的1时,下标六就会变成下标5接着运行 j不会改变
                // 直到 内循环运行结束,或超出判断范围
                 arr.splice(j,1);
             }else{
               // 这是刹车器,当j的值超出范围停止运行
                j++
             };
         }
     }

     console.log(arr);

slice

         *      语法: 数组.slice(开始下标, 结束下标)
         *              参数的特点:
         *                      1. 包前不包后
         *                      2.   开始与结束都省略, 相当于复制整个数组,省略结束下标, 那么会从开始下标复制到数组的末尾
         *                      3. 参数可以支持 负数, 相当于 数组.length + 负数
         *                      4 . 不改变原数组,返回新数组
         *      作用: 复制出指定范围的内容
         *      返回值: 复制到的内容
         *
         
            var arr=[1,2,3,"a",5,6];
             // 如果没有结束表示到数组的尾部
             var arr1=arr.slice(0);
              console.log(arr1);// [1, 2, 3, 'a', 5, 6]
              // 允许负数,负数从后向前数
               var arr1=arr.slice(-1);
               console.log(arr1);//获取最后一个数组 [6]
               
           // var item=arr.slice(-1)[0];//获取最后一个元素组成的数组,
                                            并且从这个数组中获取第0项
                                              
                        当没有起始下标和结束下标时,表示从数组的第0项到结束
                        数组浅复制
                        var arr1=arr.slice();
                        console.log(arr1);        
             

concat

             *      语法: 数组.concat(数据1, 数据2, 数据3, 数据4.......)
             *      作用: 将传入的数据, 合并到指定的数组中, 然后返回出来,   注意: 不会改变原数组!!!
             *      返回值: 合并后的数组
             *
                      // 数组浅复制
                        var arr=[1,2,3];
                        var arr1=arr.concat();
                        arr[0]=100;
                        console.log(arr1);// [1, 2, 3]
                        console.log(arr) // [100, 2, 3]
                        

with

            // with(要替换元素的下标,要替换为的元素)
            // 将数组中指定下标位置的元素,替换为给定元素 只能替换一个元素
            // 不改变原数组,返回替换后的新数组  
            
                var arr=[1,2,3,4,5,6];
               var arr1=arr.with(2,"a");
               console.log(arr1,arr);
               arr1:[1, 2, 'a', 4, 5, 6]
               arr : [1, 2, 3, 4, 5, 6]
               
                var arr = [1, 2, 3, 4, 5, 6];
  
                // 将数组中的元素5替换为元素0
                var arr1 = arr.with(arr.indexOf(5), 0);
                console.log(arr1); //
               

copyWithin

           // copyWithin  复制当前数组中某个位置开始到某个位置结束的
           所有元素到当前数组指定为止开始一直到结束的元素,不改变原数组长度
           // 改变原数组,并且返回原数组
            var arr=[1,2,3,4,5,6];
   // arr.copyWithin(要复制到的起始位置,从什么位置开始复制数据, 到什么位置之前结束的复制内容)                                        
           arr.copyWithin(4,0,4);
           console.log(arr);   //  [1, 2, 3, 4, 1, 2]
           
            var arr=[1,2,3,4,5,6];
           var arr1=arr.copyWithin(2,0,2);
           console.log(arr)   //[1, 2, 1, 2, 5, 6]
           
    // 当省略结束下标的参数时,默认到当前数组的尾部
                  ,也就是结束下标是当前数组的长度
         var arr=[1,2,3,4,5,6];
         arr.copyWithin(4,0);
         console.log(arr); //[1, 2, 3, 4, 1, 2]
         
         arr.copyWithin(0,4)
         console.log(arr);//[5, 6, 3, 4, 5, 6]
    // 当使用复制时,也是允许使用负数的,负数也是从后向前数    
          var arr=[1,2,3,4,5,6];
          arr.copyWithin(0,2,-1);//负1代表最后1个下标元素
          console.log(arr);//[3, 4, 5, 4, 5, 6]
          
          var arr=["a","b","c","d","e","f"];
           // 从左往右计算
          arr.copyWithin(0,-2).copyWithin(2,-2);
         
          console.log(arr); //['e', 'f', 'e', 'f', 'e', 'f'] 

fill

    // fill  填充  从什么位置开始到什么位置之前结束填充给定第一个参数值,
           不改变数组的原长度(length)
    // 改变原数组  返回改变后的原数组
    
        var arr=[1,2,3];
        arr.fill(值,从什么位置开始,到什么位置之前结束)
        从什么位置开始 默认不写就是0开始
        到什么位置之前结束 默认不写就是到数组尾部结束

        arr.fill(1,0,3);//  [1, 1, 1]
        arr.fill(1,0);// [1, 1, 1]  如果到数组的尾部位置,最后结束下标可以不写
        arr.fill(1);//  [1, 1, 1]如果从0开始,开始位置可以不写

        arr.fill(0,1); // [1, 0, 0]
        console.log(arr);
         构建一个长度为六的数组用 数字1 填充  
         var arr=Array(6).fill(1);
         console.log(arr);//  [1, 1, 1, 1, 1, 1]
         
         
        var arr = Array(10).fill({ a: 1 });
     // 放入的这个10个对象都是同一个对象,引用地址完全相同
        console.log(arr); // 数组都是1
     // arr[0].a = 10;
        console.log(arr) //数组都是10
           

join

             *      语法: 数组.join('连接符')   连接符如果不传递默认按照','符号连接
             *      作用: 根据传入的连接符 将数组内的所有元素, 拼接成一个完整的字符串
             *      返回值: 拼接好的字符串
           
           var arr=[1,2,3,4,5]
           var str=arr.join();
           console.log(str); // 字符串用"," 号链接 1,2,3,4,5
            
       // 使用""可以将数组中的元素紧密连接在一起
            var str=arr.join("");
            console.log(str); //  12345
          toString() 没有参数,等同于使用join不填写参数
            var str=arr.toString();
            console.log(str); // 字符串用"," 号链接 1,2,3,4,5

include

    // include 判断这个元素在数组中是否存在,如果存在返回true,
       如果不存在返回false
    // 不适用判断元素为引用类型的
    // 不改变原数组,返回布尔值
    
      var arr=[1,2,3,4];
      console.log(arr.includes(3));//true
      
    var arr=[        {a:1},        {a:2},        {a:3}    ]

    // 每次写一个{}就是一个新对象,就是一个新的引用地址
     console.log(arr.includes({a:1})) // false 无法检测只会是false
     
     var arr=[,,,];
    // 空元素判断为undefined
     console.log(arr.includes(undefined));// true

indexOf

     *      语法: 数组.indexOf(要查询的数据, 从哪里开始查询(下标))  第二个参数不写默认为 0
     *      作用: 按照 从左到右(按照下标的从小到大) 的顺序
             检查数组中是否包含指定数据 不适用判断元素为引用类型的
     *      返回值: 
     *              查询到: 返回从左到右数据第一次出现的下标
     *              没有查询到: 返回 -1
     *

lastIndexOf

     *      语法:   数组.lastIndexOf(要查询的数据, 从哪里开始查询(下标))  
                   不传递第二个参数, 默认从 最后一个元素的下标 开始 查到下标0结束                         不适用判断元素为引用类型的
     *      作用:   按照 从右到左(按照下标的从大到小) 的顺序 检查数组中是否包含指定数据 , 
     *      返回值:
     *              查询到: 返回从右到左数据第一次出现的下标
     *              没有查询到: 返回 -1
    */
           

     /**

* 数组塌陷

    */

    var arr = [1, 2, 3, 4, 5]
    //         0  1  2  3  4

    for (var i = 0; i < arr.length; i++) {
        arr.splice(i, 1)
        i--
    }

    console.log(arr)    // []

    /**
     *  第 1 轮循环 i === 0     arr === [1, 2, 3, 4, 5]
     *      arr.splice(i, 1)    其实相当于 把数组 [0] 的内容删掉        [2, 3, 4, 5]
     *      i--                     i === -1
     *      第 1 轮循环结束
     * 这样才能让i从零开始
     * 
     *  第 2 轮循环 i === 0     arr === [2, 3, 4, 5]
     *      arr.splice(i, 1)    其实相当于 把数组 [0] 的内容删掉        [3, 4, 5]
     *      i--                     i === -1
     *      第 2 轮循环结束
     * 
     *  ........
    */