数组

210 阅读13分钟

冒泡排序 选择排序 数组

一.冒泡排序

核心原理
   循环遍历数组
       当前单元和下一个单元进行数据比较
       按照从小到大排序
       应该是当前单元小于下一个单元
       如果当前单元大于下一个单元
       将交换两个单元存储的数据
       一次循环结束会将一个最大值存储到数组末位
    多次循环遍历完成整个数组中数值的排序

案例:

var arr=[10,20,30,40,50];
var n=11;
arr.push(n);
​
//冒泡排序
for(var k =0; k<arr.length; k++){
    for(var i=0; i<arr.length-1-k; k++){
        if(arr[i]>arr[i+1]){
        var temp=arr[i]
        arr[i]=arr[i+1]
        arr[i+1]=temp
        
        }
​
    }
​
}
console.log('冒泡排序结束后的arr',arr);

二.选择排序

核心原理
    每次使用变量存储起始循环单元的索引下标
    使用变量中存储的索引下标对应的数据数值
    和之后的其他单元的数据数值进行比较
    
    如果之后循环单元数据数值小于变量中存储索引下标对应数据数值
    变量存储循环单元的索引下标
    
    循环结束 变量中存储本次循环 存储最小值单元的索引下标
    
    如果变量存储的索引下标不是起始单元的索引下标
    交换两个单元存储的数据数值
    
    每次循环会将最小值存储到数组的起始位置
    
    多次循环完成整个数组的排序

案例:

for(var k=0; k < arr.length; k++){
    for(var i =k+1; i<arr.length; i++){
        if(arr[minIndex]>arr[i]){
            minIndex=i
        }
    }
//交换真实最小的值 与下标0的值
var temp=arr[k]
arr[k]=arr[minIndex]
arr[minIndex]=temp
}
console.log('选择排序结束后的arr:',arr)

三、数组

1.概念:存储数据的集合

2.理解:

  • 其他数据类型一个变量中只能存储一个数据单元
  • 在数组中可以同时存储多个数据单元

3.语法

  • 字面量: var 变量=[数据1,数据2,数据3...];

  • 内置构造函数: var 变量 = [new Array(数据1,数据2, 数据3);

               属性
                        下标
                            在定义数组时 JavaScript程序 自动定义的从0开始的连续整数
                            如果下标是 数值类型 称为 索引下标
                                在 JavaScript中 下标只支持是数值类型的索引下标
                                在 其他计算机语言中 数组的下标可以是字符串类型 称为 关联下标
                            通过 索引下标 使用 []语法 操作 数组中的数据单元
    ​
                        length
                            数组的长度 也就是 数组中单元个数
                            语法 数组.length
                            索引下标是从0开始的连续整数 
                                数组索引下标的范围是 0 至 数组.length-1 
    ​
                    数据存储的数据类型
                        在 JavaScript语言中 数组中可以存储任意 JavaScript支持的数据类型
                        一个数组中 可以 存储不同类型的数据
                        
                    数组中存储函数
                        var arr = [100,200,300,function(){} ];
                            一般情况下 数组中 不会存储函数
                            数组[索引下标] 获取的是 数组单元中存储的内存地址
                            数组[索引下标]() 是 调用执行 数组中存储的函数
    

1、数组的存储

数组中存储的数据 :

数组中可以存储任意JavaScript支持的数据类型,一个数组中可以存储多种数据类型(number,String,boolean,Object等)。

数组中可以存储函数,一般存储的是匿名函数。

实际项目中,后端程序-->返回的数据, 一般都是比较复杂的数组/对象形式,数组一般是 数组中存储对象。

案例:

<script>
       var arr = [true , false , '北京' , '上海' , 100 , 100.123 , 2e3 , [100,200,300] , function(){} , {name:'张三' , age:18 , sex:'男'} ];
​
        console.log( arr );
</script>

2、数组的基本操作

  • 通过 数组[索引下标] 调用数组中指定索引下标对应的数据单元存储的数据数值
  • 如果没有对应的索引下标 调用结果是 undefined
  • 如果存储的是基本数据类型 数组[索引下标] 获取对应的数据
  • 如果存储的是函数程序 数组[索引下标] 获取的是 指定索引下标 对应的数据单元 存储的 函数的内存地址 数组索引下标 是 按照 存储的内存地址调用执行函数 如果需要可以在()中输入实参
  • 如果存储的是数组 通过 多个并列的[]语法 获取 指定单元存储的数据

案例:

<script>L
​
        // /* 
        //     数组中存储函数 
        //         本质是 在 数组单元中存储 这个函数的内存地址
        //         也就是 索引下标是5的这个单元中存储的是 匿名函数的内存地址 
        // */
        // var arr = [100,200,300,400,500 , function( num1 , num2 ){ console.log( num1 , num2 ) } ];
        // console.log( arr ) ;
​
​
        // // 调用 数组arr 中 索引下标是2 的 第三个单元 存储的数据数值
        // // 对应的数据 是 300
        // console.log( arr[2] ) ;
​
        // // 通过 数组[索引下标] 调用指定单元存储的函数程序
        // // 调用结果是 索引下标对应的数组单元存储的函数的内存地址
        // // 浏览器的显示结果是 函数的存储空间中 存储的函数程序代码
        // console.log( arr[5] ) ;
​
        // // 如果要执行这个函数
        // // arr[5] 存储的是函数的内存地址 
        // // arr[5]() 就是 调用执行这个函数
        // // 如果需要 在调用时 可以输入实参
        // arr[5]( 500 , 600 );
​
        // function fun( num1 , num2 ){ console.log( num1 , num2 ); }
​
        // console.log( fun );
        // fun( 100 , 200 );
​
​
        // 数组中存储数组
        // 数组[索引下标] 获取的是 数组中存储的数组 称为 二维数组
        // 数组中 可以 存储多层的数组 称为 多维数组
        var arr = [100,200,300,[400,500,600,[700,800,900]]] ;
        console.log( arr );
​
        // 索引下标是0的第一个单元存储的数据 是 100
        console.log( arr[0] );
​
        // 索引下标是3的第四个单元存储的数据 是 二维数组[400,500,600]
        console.log( arr[3] );
​
        // 获取二维数组的数据 使用 两个 并列的[]语法
        // arr[3] 获取的结果是 二维数组 [400,500,600]
        // arr[3] 是 二维数组 可以 接续使用 []语法 再获取二维数组中的具体数据
        // arr[3][1] 是 arr[3] 获取的是 二维数组 在这个二维数组中 再获取 索引下标是1 的第二个单元存储的数据
        console.log( arr[3][1] );
​
        // 多维数组获取数据 就是 多个并列的[]语法
        console.log( arr[3][3][2] );
​
​
        // 没有对应的索引下标 调用结果是 undefined
        console.log( arr[30] );
​
​
    </script>

3、数组的新增

数组的基本操作

修改

对已经存在的数值单元进赋值行操作,通过 []语法对指定索引下标,对应的数组单元进行重复赋值操作。

执行效果:后赋值的数据覆盖新赋值的数据,达到修改数组单元存储数据的效果

新增

对不存在的数组单元进行,赋值操作,通过 []语法对指定索引下标对应的数组单元进行赋值操作。

执行效果是:给数组新增单元对新增单元设定索引下标,同时赋值存储的数据。

实际项目中

新增单元索引下标必须是连续整数

如果不是连续整数会生成 empty 空单元,empty 空单元 调用结果是 undefined

实际项目中索引下一般都是整数数值:

1、如果输入的是 符合整数语法规范的字符串会转化为对应的整数数值。

2、 如果输入的是 不符合整数语法规范的字符串 / null / undefined / true / false

实际项目中 新增数组单元 一般使用 专门的函数方法操作执行;可以新增单元 ,但是新增单元不会计算数组长度,这样操作实际项目中一般不会使用

案例:

    <script>
        var arr = [100,200,300,400,500];
        // 执行数组的修改操作
        // 对 已经存在的索引下标 1 进行 赋值操作
        // 对 索引下标是1 的 数组中的第二个单元 进行赋值操作
        // = 等于赋值 执行的是 覆盖赋值效果
        // 后赋值的数据 '北京' 会 覆盖原始数据200
        // 数组索引下标是1 的第二个单元存储的数据 最终结果是 '北京'
        // 执行的效果 就是 修改了数组中 索引下标是1 的第二个单元存储的数据
        arr[1] = '北京' ;
​
        // 对 不存在的索引下标 5 进行 赋值操作
        // 给 数值新增一个单元 设定索引下标是5 赋值存储的数据是'我是新增的'
        arr[5] = '我是新增的' ;
​
        // // 如果设定的索引下标 不是 连续的索引下标 
        // // 可以执行新增操作 
        // // 但是 数组中会生成 empty 空单元
        // arr[50] = '我是新增的' ;
        // // 空单元的调用结果是 undefined
        // console.log( arr[48] );
        // // 实际项目中 新增单元 必须是 连续的索引下标
​
        // 如果新增单元索引下标 一定要设定成 字符串 / true / false / null / undefined
        // 数组单元中会新增这个单元 
        // 但是 length 属性 没有增加 
        // 也就是 下标是 字符串的数值单元 不计算数组长度
        arr['a'] = '我是新增的' ;
        arr[true] = '我是新增的' ;
        arr[false] = '我是新增的' ;
        arr[null] = '我是新增的' ;
        arr[undefined] = '我是新增的' ;
​
        // 如果 下标输入的是 符合 整数语法规范的字符串 
        // 会将 字符串转化为 对应的数字 作为索引下标 
        // 也就是 arr['6'] 就 等于执行 arr[6] 的操作
        arr['6'] = '我是新增的' ;
​
        // 输入的科学计数法 不是整数语法规范
        // 不能识别转化为对应的数字 只能是 2e3 三个字符 
        arr['2e3'] = '我是新增的' ;
​
        console.log(arr);
    </script>

4、数组的遍历

方法一: for循环

通过 for循环生成数组中 第一个单元 至 最后一个单元的索引下标,也就是 0 至 数组.length-1 的所有连续整数再。

通过 []语法 也就是 数组[循环变量] 来 获取操作 数组中的每一个单元。

for( var i = 0 ; i <= 数组.length-1 ; i++ ){
    i 是 数组中每一个单元的索引下标
    数组[i] 是 数组中么一个单元的数据数值
}

方法二: for...in循环

JavaScript程序自动循环数组中的每一个单元。 ​ 获取 每一个单元的索引下标 以 字符串形式存储 。 ​ 通过 []语法 使用 获取的索引下标 操作 当前循环的数组单元。

for( var 变量 in 数组 ){
    变量中存储的是 当前循环的数组单元的索引下标 以字符串形式存储
    可以 通过 数组[变量] 操作 当前循环的数组单元
}

方法三: for...of循环

JavaScript程序自动循环数组中的每一个单元。 ​ 获取每一个单元的数据数值存储到变量中。

for( var 变量 of 数组 ){
    变量中存储的是 当前循环的数组单元的数据数值
}

方法四:forEach循环

JavaScript程序自动循环数组中的每一个单元,获取 每一个单元的 索引下标 数据数值 原始数组本身 存储到对应的变量中,是 专门针对数值操作的函数方法。

数组.forEach( function( [参数1 , 参数2 , 参数3] ){})
      参数1   存储 当前循环数组单元的数据数值
      参数2   存储 当前循环数组单元的索引下标
      参数3   存储 原始数组
      实际项目中 需要哪个参数 写 哪个 

实操案例:

<script>
​
        var arr = ['北京' , '上海' , '广州' , '重庆' , '天津' , '贵阳' , '武汉'];
​
        //  需要输出每一个数据
        //  通过 索引下标 获取操作每一个数据单元
        //  每一次操作数据单元 程序代码都是相同的 只是索引下标不同
        console.log( arr[0] );
        console.log( arr[1] );
        console.log( arr[2] );
        console.log( arr[3] );
        console.log( arr[4] );
        console.log( arr[5] );
        console.log( arr[6] );
​
        //  for循环
        //  通过 循环 生成 0 - 6 的 数值 
        //  也就是 第一个单元 至 最后一个单元的索引下标
        //  第一个单元的索引下标 一定是 0
        //  最后一个单元的索引下标 一定是 数组长度-1 也就是 arr.length-1
        //  也就是 数组中 每一个单元的索引下标
        //  再通过 []语法 获取操作数组的每一个数据单元
        
        for( var i = 0 ; i <= arr.length-1 ; i++ ){
            //  i 存储的是 从 0 - 6 的 连续整数
            //  也就是 数组单元的索引下标
            //  通过 数组[索引下标] 可以 获取操作对应的数组单元
            //  也就是 arr[i]
            console.log( i ,  arr[i]);
        }
​
        // for...in 循环 
        // 变量index中存储的是 数组单元的索引下标
        // 变量index中 以 字符串形式 存储 索引下标
        for( var index in arr ){
            // index 存储的是 当前循环单元的索引下标 
            // arr[index] 存储的是 当前循环单元的数据数值
            console.log( index , arr[index] );
​
        }
​
        // for...of循环
        // 变量中存储的是 数组单元的数据数值
        for( var value of arr ){
            console.log( value );
        }
​
        // forEach循环
        // 第一个参数 存储 当前循环单元的数据数值
        // 第二个参数 存储 当前循环单元的索引下标
        // 第三个参数 存储 原始数组
        arr.forEach( function( value , index , array ){
            console.log( value , index , array );
        }) 
    </script>

5、各种遍历方式的区别

1、for循环

实际项目中  推荐使用的数组循环方法
执行效率最高
   for循环本质上没有针对数组进行循环,只是按照设定的循环条件生成数组对应的索引下标 ,然后通过索引下标操作数组单元
本质上只是0 至 数组.length-1 的数字的循环
   1、可以操作循环的进程
   2、可以通过操作循环变量的数值控制循环程序执行的过程
   3、可以通过 break 终止循环
   4、如果数组单元有非数字索引下标不能循环操作

2、for...in

实际项目中 一般用于循环遍历对象的语法
一般不用来循环数组
​
for...in循环
    真正的循环遍历操作每一个数组单元,一定会从数组的第一个单元循环遍历到数组的随后一个单元,每次循环获取当前循环单元的索引下标存储到设定的变量中
    
    注意:
    1、不能通过修改变量中存储的索引下控制循环的进程,循环的进程执行是JavaScript程序默认设定的执行进程,也就是一定会从第一个单元循环至最后一个单元 
    2、只是获取 当前循环单元的索引下标存储到变量中,不是通过变量中存储的数据控制 for..in的循环 
    3、可以通过break终止循环
    4、如果数组单元有非数字索引下标可以循环遍历获取对应的索引下标

3、for...of循环

实际项目中 一般 迭代操作
一般不用来循环数组   
​
1、不能修改循环的进程
2、可以通过break终止循环
3、如果数组单元有非数字索引下标不能循环遍历获取对应的数据数值

4、forEach循环

指针的概念: 1、所谓的指针 是 计算机程序中 一种数据的操作方式。 2、所谓的指针 可以理解为 一种 指向操作 。 3、指针指向谁 操作的就是谁。

forEach的基本循环过程: 1、首先指针指向数组的起始位置。 2、判断 当前位置 是不是数组范围内 有没有 对应的数据单元 。 3、如果没有对应的数据单元 终止循环 。 4、如果有对应的数据单元 获取这个数据单元的 数据数值 索引下标 原始数组。

5、将指针 移动到数组的下一个位置。 ​ 6、判断 当前位置 是不是数组范围内 有没有 对应的数据单元 。 ​ 7、如果没有对应的数据单元 终止循环 。 ​ 8、如果有对应的数据单元 获取这个数据单元的 数据数值 索引下标 原始数组。

9、.....

10、最终 指针移动到数组范围外 终止整个循环。

执行效率最低的循环
通过指针操作循环遍历数组的每一个单元
​
如果需要循环遍历数组的每一个单元 
使用 forEach语法比较简单
    1、forEach的循环进程一定是从第一个单元至数组的最后一个单元
    2、不能通过改变,变量中存储的数值,修改forEach循环的进程
    3、不能通过break 终止循环 
                

总结:

方法总结
for执行效率最高 可以控制进程 可以break终止 不能获取非数字索引下标单元的数据
for...in一般循环对象 不能控制进程 可以break终止 可以获取非数字索引下标单元的数据
for...of一般用于 迭代操作 不能控制进程 可以break终止 不能获取非数字索引下标单元的数据
forEach循环效率最低 执行的是指针操作 不能控制进程 不能break终止 不能获取非数字索引下标单元的数据

6、数组的操作

1、首位新增:

数组.unshift( 数据1 , 数据2 ... );
 在数组的首位新增数据单元,一次可以新增一个单元 或者 多个单元
 多个单元之间使用逗号间隔
 执行结果返回值:新增单元之后 新数组的长度

2、末位新增:

数组.push( 数据1 , 数据2 ... );
 在数组的末位新增数据单元
 次可以新增一个单元 或者 多个单元
 多个单元之间使用逗号间隔
 执行结果返回值:新增单元之后新数组的长度

3、首位删除:

数组.shift();
一次只能删除一个单元
执行结果返回值:删除单元存储的数据数值

4、末位删除:

数组.pop();
一次只能删除一个单元
执行结果返回值:删除单元存储的数据数值

案例:

 <script>
        var arr = [100,200,300,400,500];
​
        // 首位新增
        var res1 = arr.unshift( '北京' , '上海' );
        console.log( res1 );
​
        // 末位新增
        var res2 = arr.push('贵阳' , '武汉');
        console.log( res2 );
​
        // 首位删除
        // 删除首位单元 也就是 删除第一个单元
        // 第一个单元中存储的数据是 '北京'
        var res3 = arr.shift();
        console.log( res3 );
​
        var res4 = arr.pop();
        console.log( res4 );
​
        console.log( arr );
​
 </script>

5、数组删除指定单元

数组.splice( 参数1 , 参数2 , [ 其他所有参数 ] );
    参数1   删除起始位置的索引下标
    参数2   删除数组单元的个数  必须是连续的数组单元
​
 其他所有参数 在删除位置替换写入的新内容
 可以一次替换写入一个单元 可以 提替换写入多个单元   
 执行结果返回值 是 删除单元数据 组成的新数组

案例:

<script>
        var arr = [100,200,300,400,500,600,700,800,900];
​
        // // 如果要删除 300 400 500 三个单元
        // // 是 从 索引下标是 2 的位置开始 删除 3个单元
​
        // // 执行结果返回值 是 删除的 300 400 500 组成的新数组
        // var res1 = arr.splice( 2 , 3 );
        // console.log( res1 );
​
        // 如果删除 500 600 替换 写入 新内容
        var res2 = arr.splice( 4 , 2 , '北京' , '上海' , '广州' , '重庆' , '贵阳' );
        console.log( res2 );
        console.log( arr );
 </script>

6、数组数据的查询

数组.indexOf( 数值数据 )
   查询 指定数据 在数组中 第一次 出现的位置
   如果有符合的数据 返回值 是 存储数据单元的索引下标
   如果没有符合的数据 返回值 是 -1
   
数组.lastIndexOf( 数值数据 )
   查询 指定数据 在数组中 最后一次 出现的位置
   如果有符合的数据 返回值 是 存储数据单元的索引下标
   如果没有符合的数据 返回值 是 -1

案例:

 <script>
        var arr = [ 1,2,3,1,2,3,4,1,2,3,4,5,1,2,3,4,5,6,1,2,3,4,5,6,7 ];
        console.log( arr );
​
        // 查询 数值1 在数组中第一次出现的位置
        // 如果有符合的数据 返回值 是 存储数据单元的索引下标
        var res1 = arr.indexOf( 1 );
        console.log( res1 );
​
        var res2 = arr.indexOf( 4 );
        console.log( res2 );
​
        // 查询 数值1 在数组中最后一次出现的位置
        // 如果有符合的数据 返回值 是 存储数据单元的索引下标
        var res3 = arr.lastIndexOf( 1 );
        console.log( res3 );
​
        // 查询 字符a 在数组中出现的位置
        // 没有匹配的数据 返回值 是 -1
        // 执行结果是 -1 也就是 意味着 数组中没有存储这个数据
        var res4 = arr.indexOf( 'a' );
        var res5 = arr.lastIndexOf( 'a' );
        console.log( res4 );
        console.log( res5 );
 </script>

7、数组的去重

数组去重的12种方法: blog.csdn.net/weixin_4631…

实际项目中推荐使用使用 set数据类型方法

数组去重方法1  indexOf
   数组中默认是可以存储重复数据
   实际项目中 数组中不能存储重复数据
   不需要去除数组中重复的数据
​
去重的基本原理
   创建一个新的空数组
   将原始数组数据 写入新数组中
   写入时执行判断,要写入的数据 新数组中没有 再执行写入操作
​

案例:

<script>
        var arr = [1,2,3,1,2,3,4,1,2,3,4,5,1,2,3,4,5,6,1,2,3,4,5,6,7];
        console.log( arr );
​
        // // 实际项目中 使用的 数组去重代码
        // var newArr = [...new Set(arr)];
        // console.log( newArr );
​
        // indexOf / lastIndexOf 方法
        // 创建一个空数组
        var newArr = [] ;
​
        // // 将 原始数组的数据 写入新数组
        // // 需要循环遍历 原始数组的每一个单元
        // for( var i = 0 ; i <= arr.length-1 ; i++ ){
        //     // i 是 原始数组arr的索引下标 
        //     // arr[i] 是 原始数组arr中 数据单元存储的数据数值
        //     // console.log( arr[i] );
​
        //     // 将 原始数组的数据数值 也就是arr[i] 写入 新数组中
        //     // 为了确数据的顺序相同 使用 末位新增数据语法
​
        //     // 执行判断 新数组中 没有 要写入的数据 再执行写入操作
        //     // 在 新数组中 查询 要写入的数据 arr[i] 
        //     // 如果 查询结果是 -1 证明 新数组中没有要写入的数据 arr[i] 
        //     // 可以 执行写入操作
        //     if( newArr.indexOf( arr[i] ) === -1 ){
        //         // 在 新数组中 查询 要写入的 数据 arr[i]
        //         // 如果查询结果是 -1 也就是 新数组中没有要写入的原始数组数据arr[i];
        //         // 执行 末位新增数据操作
        //         newArr.push( arr[i] );
        //     }
            
        // }
​
​
        // forEach循环
        arr.forEach( function(value){
            // value 存储的是 原始数组arr中 数据单元存储的数据数值
            // console.log( value );
​
            // 判断 原始数组数据value 不在 新数组newArr 中 执行写入操作
            if( newArr.indexOf( value ) === -1 ) newArr.push( value );
            
        })
​
        console.log( newArr );
</script>

8、数组的截取

数组的截取方法
    从数组中 截取 部分数据单元 组成新数组 
    截取函数的执行结果 返回值 是 截取的新数组
    ! 不会改变 原始数组中 存储的数据内容
​
语法
    var 变量 = 数组.slice( 参数1 , 参数2 );
    执行结果返回值 是 截取原始数组内容 组成的新数组
​
    参数1   截取起始位置的索引下标
    参数2   截取结束位置的索引下标
    ! 截取结果不包括结束位置的数据数值    

案例:

 <script>
        var arr = [100,200,300,400,500,600,700,800,900];
​
        // // 数组的删除操作 执行结果返回值 是 删除的数组单元组成的新数组
        // // 但是会改变原始数组中存储的内容
        // var res1 = arr.splice( 2 , 4 );
        // console.log( res1 );
​
        // 从 索引下标是 2 的单元开始截取
        // 截取至 索引下标是 6 的单元 结束
        // 截取 结果 是 索引下标 是 2 3 4 5 的 4个单元的数据 
        // 没有 结束位置 索引下标是6的单元的数据
        var res2 = arr.slice( 2 , 6 );
        console.log( res2 );
​
        console.log( arr );
 </script>

9、数组反转

 <script>
        /*
            数组的反转 
                将 原始数组内容都反向排序
                数组.reverse()
        */
​
        var arr = [100,200,300,400,500];
​
        arr.reverse();
​
        console.log( arr );
 </script>

10、数组排序

数组的排序方法:

数组.sort();
   按照 首字符的大小排序
   
数组.sort(function( 参数1 , 参数2 ){ return 参数1 - 参数2 })
   小 到 大 排序
​
数组.sort(function( 参数1 , 参数2 ){ return 参数2 - 参数1 })
   从 大 到 小 排序   

案例:

<script>
        
        var arr = [312,432,456,567,897,234,123,6543,7865,434,1234,213,465,43,]
       
        // 首字符排序
        arr.sort();
​
        // 小 -- 大
        arr.sort( function( a , b ){ return a - b });
​
        // 大 -- 小
        arr.sort( function( num1 , num2 ){ return num2 - num1 });
​
        console.log( arr );
 </script>

11、数组拼接

<script>
        /*
           数组的拼接操作
                将两个数值的数据 拼接成 一个数组
                不会改变原始数组的内容
                执行结果返回值是 两个数值拼接的结果
                
                var 变量 = 原始数组.concat( 数组1 , 数组2 .... );
                可以将 一个或者多个数值的数据 拼接到一个数组中
        */
​
        var arr = [100,200,300];
​
        var arr1 = [400,500,600];
        var arr2 = [700,800,900];
​
        var res = arr.concat( arr1 , arr2 );
​
        console.log( arr );
        console.log( res );
    </script>

12、数组字符串转换

数组 --- 字符串 
    var 变量 = 数组.join();
        将数组数据拼接为字符串
        以 逗号 为间隔符号
​
    var 变量 = 数组.join('间隔符号');
        将数组数据拼接为字符串
        以 设定的符号 为间隔符号
​
    var 变量 = 数组.join('');
        将数组数据拼接为字符串
        以 设定参数是 空字符串 没有 间隔内容
​
    字符串 --- 数组
        var 变量 = 字符串.split();            

案例:

<script>
   
        // var arr = [100,200,300,400,500,600];
    
        // // 没有定义参数 默认以逗号为间隔符号 
        // // 获取数组中每一个数据单元的数值 拼接为 字符串
        // var res1 = arr.join();
        // console.log( res1 );
​
        // // 以设定的符号 为间隔符号 
        // // 获取数组中每一个数据单元的数值 拼接为 字符串
        // var res2 = arr.join('-');
        // console.log( res2 );
​
​
        // // 设定空字符串 没有 间隔内容
        // // 获取数组中每一个数据单元的数值 拼接为 字符串
        // var res3 = arr.join('');
        // console.log( res3 );
​
​
        var str = 'abc-abc-abc-abc-abc';
​
        // 将字符串转化为数组
        // 没有设定参数 整个字符串作为一个整体存储到数组中
        var res1 = str.split();
        console.log( res1 );  
​
        // 将字符串转化为数组
        // 以设定的 间隔符号 作为依据 将字符串分割
        // 分割结果中 不包括 分割符号
        // 也就是 设定 '-' 分割结果中 没有 '-'
        // 字符串 'abc-abc-abc-abc-abc' 
        // 按照 - 减号 进行分割 结果是  abc abc abc abc abc
        var res2 = str.split('-');
        console.log( res2 );  
​
        // 使用 空字符串 作为 分割符号 每一个字符都是一个数组单元
        var res3 = str.split('');
        console.log( res3 );
 </script>

13、数组扁平化

数组的扁平化 
将 多维数组 转化为 一维数组
    [100,200,300,[400,500,600,[700,800,900]]];
    
多维数组
    [100,200,300,400,500,600,700,800,900]
一维数组
    实际项目中 数组如果存储的是 复杂的数据结构 例如对象/函数
    需要使用 复杂的递归程序完成或者其他的函数方法完成
    如果存储的是 基本数据类型 可以使用 简答的方法实现

案例:

<script>
        var arr = [100,200,300,[400,500,600,[700,800,900]]];
        console.log( arr );
​
        // 将数组转化为 字符串
        // 默认以逗号间隔
        // 转化结果是 将 多维数组数据都获取到 拼接为字符串
        // var str = arr.join();
​
        // 变量.toString() 
        // 可以获取数组中每一个单元的数据 以逗号为间隔 拼接成字符串
        // var str = arr.toString();
​
        // String( 变量 )
        // 可以获取数组中每一个单元的数据 以逗号为间隔 拼接成字符串
        var str = String( arr );
​
        console.log( str );
​
        var newArr = str.split(',');
        console.log( newArr );
 </script>

14、数组的映射

名词解释: 镜像: 一模一样的

镜像: [1,2,3,4,5] ---- [1,2,3,4,5]

映射: 一一对应 但是 经过操作数据不同,单元个数相同 但是 数据做过 操作 ​ 映射:[1,2,3,4,5] --- [2,4,6,8,10]

数组的映射
    将数组单元执行对应的操作 生成一个新的数组
    不会改变原始数组中存储的数据单元
      var 变量 = 数组.map( function( 参数1 , 参数2 , 参数3 ){
         return 原始数组单元的操作 ;
    });
    
        参数1 原始数组的数据数值
        参数2 原始数组的索引下标
        参数3 原始数组
        执行结果返回值 是 映射的新的数组       

案例:

<script>     
        var arr = [100,200,300,400,500];
​
        // 生成一个新的数组 存储的数据是原始数组的2倍
        var newArr = arr.map( function( value , index , array ){
            console.log( value , index , array );
​
            // 返回值的新数组 存储的数据是 原始数组数据的2倍
            return value*2 ;
        })
        console.log( arr );
        console.log( newArr );
​
        // 数组扁平化 
        var arr = [100,200,300,[400,500,600,[700,800,900]]];
​
        // 数组转字符串
        var str = arr.join();
​
        // 字符串转数组 以 逗号为间隔
        var newArr = str.split(',');
​
        console.log( newArr );
​
        // 通过映射 将 newArr 中 存储的字符串数据 准化为 数值数据
        var res = newArr.map(function( value ){
            // 将 newArr数组中的数据 操作 转化为数值类型 生成一个新数组
            return Number( value );
        })
​
        console.log( res );
    </script>

15、数组的过滤

数组的过滤
  将符合条件的数组单元存储的数组 生成一个新的数组
  过滤的条件 可以是 任意条件 生成的新数组是 符合条件的单元的数据
​
  var 变量 = 数组.filter( function( 参数1 , 参数2 , 参数3 ){
          return 设定的条件;
  })
   
   参数1   原始数组的数据数值
   参数2   原始数组的索引下标
   参数3   原始数组                

案例:

<script>       
        var arr = [100,200,300,400,500,600,700,800,900];
​
        //  将存储的数值 大于 400 的 单元 生成一个新数组
        var res1 = arr.filter( function( value ){
            return value > 400 ;
        });
​
        console.log( res1 );
​
        // 将 索引下标 是 偶数的单元 生成一个新数组
        var res2 = arr.filter( function( value , index ){
            // 过滤的条件是 索引下标是 偶数
            return index % 2 === 0 ;
        })
        
        console.log( res2 );
 </script>

16、数组的判断

数组的判断
   判断 数组中 有没有 符合条件的数据
​
数组.some( function( 参数1 , 参数2 , 参数3 ){
        return 判断的条件 ;
})
       参数1   原始数组的数据数值
       参数2   原始数组的索引下标
       参数3   原始数组
​
       只要有一个 符合条件的数据 返回值 就是 true
       如果所有数据 都不符合条件 返回值 才是 false
​
​
数组.every( function( 参数1 , 参数2 , 参数3 ){
        return 判断的条件 ;
})
       参数1   原始数组的数据数值
       参数2   原始数组的索引下标
       参数3   原始数组
​
       每一个数据单元 必须都符合条件 返回值 才是 true 
       有一个数据单元 不符合条件 附加值 就是 false

案例:

<script>     
        var arr = [100,200,300,400,500,600,700,800,900];
​
        // 判断 有没有 大于 500 的 数值
        // 只要有一个 符合条件的数据 返回值 就是 true
        var res1 = arr.some( function( value ){
            return value > 500 ;
        })
        console.log( res1 );
​
        // 判断 所有数据都要 大于 500
        // 必须每一个数据 都符合条件 返回值 才是 true
        var res2 = arr.every( function( value ){
            return value > 500 ;
        })
        console.log( res2 );
        
​
    </script>

17、数组的复杂查询

数组的复杂查询
​
1,  数组的简单查询 
    数组.indexOf( 数据 )
    数组.lastIndexOf( 数据 )
         返回 索引下标 / -1
         数据只能是 基本数据类型
​
2,  数组的判断 
    数组.some( function(参数1, 参数2){ return 条件 } )
    数组.every( function(参数1, 参数2){ return 条件 } )
         返回 true / false3,  数组的复杂查询
    数组.find( function( 参数1 , 参数2 , 参数3 ){
                        return 条件
     })
         返回符合条件的数据
         返回的是 第一个 符合条件的数据 
​
         实际项目中 数组存储复杂数据类型 执行数据查询时使用 
​
         一般是 数组中存储对象时使用
​
         返回值 是 符合条件的 数组中存储的对象
         如果没有符合条件的数据 返回值 是 undefined
        
数组.findIndex( function( 参数1 , 参数2 , 参数3 ){
          return 条件
})
         返回符合条件的数据
         返回的是 第一个 符合条件的数据 所在单元的索引下标
​
         一般是针对数组中存储的对象 执行操作
         返回值 是 存储符合条件数据的对象 在 数组中的索引下标

案例:

<script>
        // var arr = [100,200,300,400,500,600,700,800,900];
​
        // // 返回第一个符合条件的数据
        // var res = arr.find( function( value ){
        //     return value > 500 ;
        // })
​
        // console.log( res );
​
        // 一般是用于复杂数据查询操作
        // 例如 数组中 存储对象时 查询使用
        var arr = [
            { id:1 , name:'张三' , age:18 , sex:'男' },
            { id:2 , name:'李四' , age:19 , sex:'女' },
            { id:3 , name:'王五' , age:20 , sex:'男' },
            { id:4 , name:'赵六' , age:21 , sex:'女' },
            { id:5 , name:'刘七' , age:22 , sex:'保密' },
        ];
        console.log( arr );
​
        // 复杂数据的查询操作
        // 返回值结果 是 对象中name是王五的这个 对象 
        var res1 = arr.find( function( value ){
            // value 是 数组中的数据数值 也就是 当前存储的对象
            return value.name === '王五' ;
        })
​
        console.log( res1 );
​
        // 复杂数据的查询操作
        // 返回值结果 是 对象中name是王五的这个 对象 
        var res2 = arr.findIndex( function( value ){
            // value 是 数组中的数据数值 也就是 当前存储的对象
            return value.name === '王五' ;
        })
​
        console.log( res2 );
</script>

18、数组的叠加

数组的叠加
    将数组单元的数据 执行 累加操作
    
            没有设定初始值
                var 变量 = 数组.reduce(function(参数1,参数2,参数3,参数4){
                    return 参数1 + 数据 ;
                })
                    参数1   存储初始值 和 叠加结果
                    参数2   原始数组数据数值
                    参数3   原始数组索引下标
                    参数4   原始数组
​
​
                    循环次数是 数组.length-1 次
                    默认获取第一个单元存储的数据 作为 初始值 存储到参数1 中
                    从 第二个单元开始循环 
                    每次循环 给 参数1 累加设定的数值
​
             
            设定初始值
                var 变量 = 数组.reduce(function(参数1,参数2,参数3,参数4){
                    return 参数1 + 数据 ;
                } , 初始值 )
                    参数1   存储初始值 和 叠加结果
                    参数2   原始数组数据数值
                    参数3   原始数组索引下标
                    参数4   原始数组
​
                    先 将 设定的初始值 存储到 参数1 中
                    从 数组的第一个单元开始循环
                    循环次数是 数组.length 次
                    

案例:

<script>
        // var arr = [100,200,300,400,500,600,700,800,900];
​
        // // 没有设定初始值
​
        // // 从 第二个单元 开始 循环 
        // // prev 起始默认值 是 第一个单元存储的数值100
        // // 以此类推 执行 累加操作
        // // 一共循环 数组.length-1 次
        // var res1 = arr.reduce( function( prev , value , index , array ){
        //     // console.log( prev , value );
​
        //     // 本质上执行的是 从 数组的第一个单元存储的数据开始 执行 累加操作
        //     // 累加的数值 可以是数组单元的数据 也可以任意数据
        //     // return prev + value ;
        //     // return prev + 100 ;
​
        //     // 如果 有字符串参与 叠加的结果就是字符串
        //     return prev + '北京' ;
​
        // })
​
        // console.log( res1 );
​
        var arr = [100,200,300,400,500,600,700,800,900];
​
        // 设定初始值
​
        // 从 第一个单元 开始 循环 
        // 循环执行的次数是 数组.length 次
        var res2 = arr.reduce( function(prev , value){
            // prev中存储的就是 设定的初始值 1000 
            // console.log( prev );
​
            // return prev + 100 ;
            return prev + value ;
​
        } , 1000 );
​
        console.log( res2 );
    </script>

二、对象

1、对象的基本介绍

JavaScript 对象的基本介绍   object / obj
       对象 是 JavaScript中一种数据类型
       存储数据的集合
​
       JavaScript中 对象的 索引 是 字符串类型
            以 键值对 的形式 存储数据
            键名:键值 / 键:值 / 属性:属性值
​
       JavaScript语法
​
            字面量 
                  var 对象 = { 键名:键值 , 键:值 , 属性:属性值 };
​
            构造函数
                  var 对象 = new Object({ 键名:键值 , 键:值 , 属性:属性值 });
​
            浏览器显示对象内容时 按照 键名的首字符顺序显示 
            是 浏览器本身设定的显示效果 跟 js程序没有关系
<script>
        // 字面量
        var obj1 = { name:'张三' , age:18 , sex:'男' };
        console.log( obj1 );
​
        // 构造函数
        var obj2 = new Object( { name:'张三' , age:18 , sex:'男' } );
        console.log( obj2 );
​
    </script>

2、对象的基本操作

调用

语法形式1
    对象.属性
    对象.键名
    对象.键
​
    获取对应的 属性值 / 键值 / 值
​
语法形式2
    对象['属性']
    对象['键名']
    对象['键']
​
    获取对应的 属性值 / 键值 / 值             

点语法 和 []语法 的区别

 1,  键名/键/属性 一般都是 字符串形式 
          如果键名是 数值类型
          
          点击语法 不执行 执行结果是 报错
          
          []语法 支持 可以获取对应的结果
​
2,  通过 变量中存储的 键名/键/属性 获取对应的 数据
          点语法 不能解析变量 会 使用 变量名称 作为 键名 获取对应的数据
​
          []语法 可以解析变量 会 使用 变量中存储的数据 作为 键名 获取对应的数据 
          []语法中 写入的是 键名 要加 定界符 
          []语法中 写入的是 变量 不要加 定界符

修改 :

对已经存在的 键名/键/属性 进行 重复赋值操作
后赋值的数据覆盖存储的原始数据 执行效果 是 修改对象中存储的数据
                

新增:

对 不存在的 键名/键/属性 进行 赋值操作
给 对象新增数据单元 设定 键名 和 存储的键值

删除:

    delete( 对象.属性 )
    delete( 对象['属性'] )
​
    delete 对象.属性
    delete 对象['属性']
​
    删除对象中指定的单元

案例:

<script>
        // var obj = { name:'张三' , age:18 , sex:'男' , 0:100 , 1:200 , 2:300 };
        // console.log( obj );
​
        //  获取 name 存储的对应的数据
​
        // //  点语法
        // console.log( obj.name ) ;
        // console.log( obj.age ) ;
        // console.log( obj.sex ) ;
​
        // //  []语法
        // console.log( obj['name'] );
        // console.log( obj['age'] );
        // console.log( obj['sex'] );
​
​
        //  对象中 键名是 数值类型
​
        // // 点语法 不支持 键名是 数值类型 
        // // console.log( obj.0 );
​
        // // []语法 支持 键名是 数值类型
        // console.log( obj[0] );
        // console.log( obj[1] );
        // console.log( obj[2] );
​
​
​
        // var obj = { name:'张三' , age:18 , sex:'男' };
​
​
        // // 使用变量 存储 键名 
        // var str = 'name' ;
​
        // // 通过变量str 使用 其中存储的键名 获取对应的键值
​
        // // 点语法
        // // 点语法 不能解析 变量 
        // // 使用的是 str 这个变量名称作为 键名 从对象中调用数据
        // console.log( obj.str );
​
        // // []语法
        // // []语法 可以解析 变量
        // // 解析变量str中存储的数据 解析结果是 'name' 
        // // obj[str] 也就是解析结果是 obj['name'] 
        // // 可以 获取 'name' 键名 对应的 数据 张三
​
        // // []语法中 定义的如果是 键名 要加 '' 定界符 
        // // []语法中 定义的如果是 变量 不要加 '' 定界符 
        // console.log( obj[str] );
​
        var obj = { name:'张三' , age:18 , sex:'男' };
​
        // 对象的修改操作
        // 对 已经存在的数据单元 进行 赋值操作
        obj.name = 'jack';
        obj['age'] = 20;
​
        // 对象的新增操作
        // 对 不存在的数据单元 进行 赋值操作
​
        obj.addr = '北京' ;
​
        obj['phone'] = 123456 ;
​
        // 对象的删除操作
        delete( obj.name );
​
        delete obj['addr'] ;
​
        console.log( obj );
​
    </script>