3、js数组

一、JS数组

在这里插入图片描述

1. 什么是数组?

具有相同类型(或者不同类型)的数据有序集合 ,每个值叫做一个元素,而每个元素在数组中有一个位置,以数字表示,称为索引/下标。js的数组是无类型的,数组元素可以是任意类型,同一个数组中的不同元素可能是对象或数组。
在这里插入图片描述

2. 创建数组

创建一个数组,有三种方法。

  1. 构造函数方式:

    var myCars=new Array();
    myCars[0]="奥迪";      
    myCars[1]="宝马";
    myCars[2]="奔驰";
    
  2. 简洁方式:

    var myCars=new Array("沃尔沃","保时捷","奥拓");
    

    注意:空数组的长度 var myCars=new Array(3);如果是数字是数组的长度,如果是非数字那么则是一个一个元素。

  3. 字面量定义方式:常用

    var myCars=["凯迪拉克","宝骏","QQ"];
    var myCars=[]; //空数组
    

3. 访问数组

通过指定数组名以及索引号码,你可以访问某个特定的元素。

var name=myCars[0];

以下实例修改了数组 myCars 的第一个元素:

myCars[0]="雪佛兰";

4. 遍历数组

遍历数组:利用循环获取数组中每个元素的值

var arr = ['周杰伦', '蔡依林', '侯佩岑', '田馥甄','张三'];
for (var i = 0; i < arr.length; i++) {
		console.log(arr[i]);
	}

5. 数组方法和属性

  1. 使用数组对象预定义属性和方法:

    var x=myCars.length             // myCars 中元素的数量
    var y=myCars.indexOf("玛莎拉蒂")   // "玛莎拉蒂" 值的索引值
    
  2. 成员访问符

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>什么是属性?什么是方法</title>
    </head>
    <body>
        <script>
            var arr = ['北京', '上海', '广州', '深圳'];
            console.log(arr);
            //length是每个数组自带的属性,表示数组的长度
            console.log(arr.length); //访问属性的时候不加()
    
            //indexOf()是每个数组自带的方法,查找元素在数组中的位置
            console.log(arr.indexOf('广州'));
    
            /* 
            成员访问符:
                .  点号
                    点号后面必须跟一个有效的js标识符(变量名的命名规范)
                    点号后面不能解析变量
                [] 中括号
                    点号能干的,[]都能干;
                    点号不能干的,[]还是能干;
            */
            console.log(arr['length']);
            console.log(arr['indexOf']('深圳'));
    
            // console.log(arr.0); //报错
            console.log(arr[0]);
    
            console.log(arr[ 1+1 ]);
    
            var n = 3;
            console.log(arr.n); //不会把n解析成3
            console.log(arr[n]); //[]里面的内容不加引号,会被当成变量,会把n解析成3
        </script>
    </body>
    </html>
    

6. 数组的增删改查

6.1 增

  1. 从数组的尾部添加一个元素

    var arr = [0,1,2,3,4,5];
    arr[arr.length] = 6;
    
  2. 从数组的头部添加一个元素

    var arr = [1,2,3,4,5];
    for(var i = arr.length-1;i>=0;i--){
    	//把当前索引中的值复制给下一个索引
    	arr[i+1]=arr[i];		
    	}
    arr[0] = '哈哈';
    
  3. 从数组的中间(某个索引值的位置)添加一个元素

    var arr = [0,1,2,3,4,5];
    for(var i = arr.length-1;i>=3;i--){
    	//把当前索引中的值复制给下一个索引
    	arr[i+1]=arr[i];
    	}
    arr[3] = '哈哈';
    

6.2 删

  1. 从数组的尾部删除一个元素

    var arr = [0,1,2,3,4,5];
    arr.length--;
    arr.length -= 1;
    
  2. 从数组的头部删除一个元素

    var arr = [0,1,2,3,4,5];
    for (var i = 1; i < arr.length; i++) {
    	// 把当前索引中的值复制给上一个索引
    	arr[i-1] = arr[i];
    	}
    arr.length--;
    console.log(arr);
    
  3. 从数组的中间(某个索引值)删除一个元素

    var arr = [0,1,2,3,4,5];
    for (var i = 3; i < arr.length; i++) {
    	//把当前索引中的值复制给上一个索引
    	arr[i-1] = arr[i];
    	}
    arr.length--;
    console.log(arr);
    

6.3 改

var arr = [0,1,2,3,4,5];
arr[0] = 8;
console.log(arr);

6.4 查

var arr = [0,1,2,3,4,5];
console.log(arr[0]);
案例:将元素为3的元素修改为300

7. 案例练习

  1. 对数组进行求和var arr = [6, 7, 8, 9,10];

  2. 输出数组中最大的值

    var arr2 = [1, 2, 3, 0, 5];
    // 最大值
    // 默认认为数组的一个元素是当前最大值
    var max = arr2[0];
    for (var i = 1; i < arr2.length; i++) {
    				// max比后面的小
    				if (max < arr2[i]) {
    						max = arr2[i];
    				}
    	}
    console.log(max);
    

    案例:最小值,平均数

  3. 将数组中所有元素和|拼接成一个新的字符串

    eg:'周杰伦|蔡依林|侯佩岑|田馥甄|张三

    var arr3 = ['周杰伦', '蔡依林', '侯佩岑', '田馥甄', '张三'];
    var sum = '';
    for (var i = 0; i < arr3.length-1; i++) {
    		sum += arr3[i]+'|';		
    	}
    sum+=arr3[arr3.length-1];
    console.log(sum);
    
  4. 反向遍历

    var arr4 = ['周杰伦', '蔡依林', '侯佩岑', '田馥甄', '张三'];
    for(var i = arr4.length-1;i>=0;i--){
    		console.log(arr4[i]);
    	}
    
  5. 动态按序从尾部插入数组元素

    var arr7 = [];
    // arr7.length  0
    arr7[arr7.length] = '哈哈';
    // arr7.length  1
    arr7[arr7.length] = '呵呵';
    // arr7.length  2
    arr7[arr7.length] = '嘿嘿';
    console.log(arr7);
    
  6. 去掉数组中元素的值是0的,重新生成一个新数组

    var arr5 = [5,0,4,2,0,8,0,9];
    var newArr = [];
    for (var i = 0; i < arr5.length; i++) {
    		if(arr5[i] != 0){
    			//插入新数组
    			newArr[newArr.length] =arr5[i];
    		}
    	}
    console.log(newArr);
    
  7. 翻转数组

    • 在新数组当中翻转

      var arr = [1,2,3,4,5,6];
      var newArr = [];
      for(var i = arr.length - 1; i >= 0; i--){
      	newArr[newArr.length] = arr[i];
      }
      console.log(newArr);
      
  • 在原数组上进行翻转—》非常重要

       var arr = [1,2,3,4,5,6];
     
    //			i 0     4
       //			i 1     3
       //			i 2     2
       console.log(arr);
       for(var i = 0; i < arr.length/2; i++){
       		var temp = arr[i];
       		arr[i] = arr[arr.length - 1 - i];
       		arr[arr.length - 1 - i] = temp;
       	}
       console.log(arr);
    

思考:如果arr.length没有除以2那么会发生什么情况???

  1. 合并数组,原生实现

    • 合并在新数组当中

      var arr1 = [1,3,5,7,9];
      var arr2 = [2,4,6,8,10];
      //1、合并在新数组当中
      var newArr = [];
      for(var i = 0; i < arr1.length; i++){
      	//在把arr1内部的数据添加到newArr当中
        		newArr[newArr.length] = arr1[i];
      	}
      			
      for(var i = 0; i < arr2.length; i++){
      	//在把arr1内部的数据添加到newArr当中
      		newArr[newArr.length] = arr2[i];
      	}
      console.log(newArr);
      
    • 在原数组上进行合并

      for(var i = 0; i < arr1.length; i++){
      		arr2[arr2.length] = arr1[i];
      	}
      console.log(arr2);
      
  2. 数组去重

    var arr = [1,2,3,4,1,1,2,1,3,2,4];  //去重完成 [1,2,3,4]
    //数组去重都是在新数组当中去重的;
    var newArr = [];
    var flag = true;
    for(var i = 0; i < arr.length; i++){
    	//从arr数组当中拿数
    	for(var j = 0; j < newArr.length; j++){
    		//拿新的数组当中的值和老数组拿的值进行比较
    		//而且从原数组当中拿的值,必须和新数组当中所有的值比较完成,才知道有没有
    		if(arr[i] == newArr[j]){
    			//代表着新数组内部有这个值;
    			flag = false;
    			break;
    			}
    	}
    	//break出来的,代表新数组当中有这个值
    	if(flag){
    			newArr[newArr.length] = arr[i];
    	}
    	flag = true;//重置标志位
    }					
    console.log(newArr);
    
  3. 冒泡排序

<script>
			var arr = [6,5,3,1,2,4];
			for (var i = 0; i < arr.length-1; i++) {
				for(var j = 0;j<arr.length-1-i;j++){
					if(arr[j] > arr[j+1]){
						//交换
						var temp = arr[j];
						arr[j] = arr[j+1];
						arr[j+1] = temp;
					}
				}				
			}
			console.log(arr);
</script>

8. 多维数组

//一维数组
var arr = [1,2,3,4,5];
console.log(arr[2]);
			
//二维数组   一维数组当中的元素,又是一个一维数组
var arrTwo = [[1,2],[3,4],[5,6]];
console.log(arrTwo[1][1]);//4
			
//三维数组
var arrThree = [
				[[1,2],[3,4]],
				[[5,6],[7,8]],
				[[9,10],[11,12]]
			]
console.log(arrThree[2][0][1]);

9. 数组方法

	var arr = [1,2,3,4];
			//数组增删改查
			
			//从末尾增
			var result = arr.push(100,200,300,[1,2,3]);
			console.log(result);
			console.log(arr);
			//功能:从数组的末尾增加一个或者多个
			//参数:增加的元素
			//返回值:返回加入元素后数组的新长度
			//这个方法对原数组有影响
			
			//从末尾去删
			var result = arr.pop();
			console.log(result);
			console.log(arr);
			//功能:从数组的末尾删除一个
			//参数:无
			//返回值:返回删除的那一个元素
			//这个方法对原数组有影响
			
			//从头部增
			var result = arr.unshift(100,200,300,[1,2,3]);
			console.log(result);
			console.log(arr);
			//功能:从数组的头部增加一个或者多个
			//参数:增加的元素
			//返回值:返回加入元素后数组的新长度
			//这个方法对原数组有影响
			
			//从头部去删
			var result = arr.shift();
			console.log(result);
			console.log(arr);
			//功能:从数组的头部删除一个
			//参数:无
			//返回值:返回删除的那一个元素
			//这个方法对原数组有影响
			
			
			//增删改一体化
			//这个方法根据参数的不同,有不同的功能
			//这个方法我们大家先当作删除去理解
			//删除
			var result = arr.splice(1,2);
			console.log(result);
			console.log(arr);
			//功能:从数组的任意位置删除任意个元素
			//参数:两个   第一个代表从哪开始,第二个代表删除几个
			//返回值:返回删除的元素组成的新数组
			//这个方法对原数组有影响
			
			//增加
			var result = arr.splice(2,0,400,500,600);
			console.log(result);
			console.log(arr);
			//功能:从数组的任意位置添加任意多个元素
			//参数:多个   第一个代表从哪开始,第二个代表删除0个,后面的代表新增的元素
			//返回值:返回删除的元素组成的新数组,最终是空数组
			//这个方法对原数组有影响
			
			//修改
			var result = arr.splice(1,1,1000,2000);
			console.log(result);
			console.log(arr);
			//功能:修改数组当中任意的元素
			//参数:多个   第一个代表从哪开始,第二个代表删除几个,后面的代表新增的元素
			//返回值:返回删除的元素组成的新数组
			//这个方法对原数组有影响
			
			//翻转数组
			var result = arr.reverse();
			console.log(result);
			console.log(arr);
			console.log(result == arr);
			//功能:翻转数组
			//参数:无
			//返回值:返回翻转后的原数组
			//这个方法影响原数组

			arr = [18,2,10,9,88,66,22];
			
			var result = arr.sort(function(a,b){
				return b - a;
			});
			console.log(result);
			console.log(arr);
			console.log(result === arr);
			//功能:对数组进行排序
			//参数:如果不写,默认把每个元素转化为字符串进行排序(按照Unicode码)
			//	   如果要按照升序降序去排,需要传一个参数是函数
			//     这个函数有两个形参
			//返回值:排好序的原数组
			//这个方法对原数组有影响



			//把数组再转化为字符串  和字符串方法 split是一个逆运算
			var result = arr.join('');
			//功能:以指定的字符串为连接符,将数组元素连接成一个字符串
			//参数:如果不传,默认以逗号为连接符,将元素连接成字符串
			//		如果传的是正常字符串,那么以这个字符串为连接符将元素连接成字符串
			//     如果传的是空串,那么直接将字符串连接成字符串,中间没有任何连接
			//返回值:返回连接好的字符串
			//这个方法对原数组没有影响
			console.log(result);
			console.log(arr);

			//concat
			var result = arr.concat([100,200,300]);
			console.log(result);
			console.log(arr);
			console.log(arr === result);
			//功能:在数组的末尾拼接元素
			//参数:可以不写,相当于复制一个数组
			//     也可以写一个或者多个值,会把这些值拼接到数组末尾
			//     也可以写数组,会先把数组拆开,把元素拼接到数组末尾
			//返回值:返回拼接好的新数组
			//这个方法对原数组没有影响

			//slice
			var result = arr.slice(1,3);
			console.log(result);
			console.log(arr);
			//功能:在数组当中截取部分元素形成新数组
			//参数:和字符串方法slice一致;起始位置和结束位置,不包含结束位置的元素
			//  如果只传一个代表起始位置,一直到结束。两个位置都可以使用负数
			//返回值:返回截取的元素形成的新数组
			//这个方法对原数组没有影响

    		//fill() 填充数组,使用指定的内容填充数组
            arr.length = 100;
            arr.fill(1); //100个1
            console.log(arr);
					
			//valueOf 是Object的原型当中的
			//返回数组实例对象。
			var result = arr.valueOf()
			console.log(result);
			console.log(arr);
			console.log(result === arr);

			var o = new String('111');
			console.log(typeof o);
			var s = o.valueOf();
			console.log(typeof s);
			//功能:获取数组对象的基本值,数组实例对象。
			//参数:无
			//返回值:返回原数组,因为数组是非包装对象,所以它是没有基本值
			
			//toString
			var result = arr.toString()
      		console.log(result);
			console.log(arr);
			//功能:将数组对象转化为字符串
			//参数:无
			//返回值:把数组的中括号去掉,其余加引号形成字符串返回

			//对象/数组在参与数学运算的时候会发生隐式转换,会:
            //1. 调用 valueOf() 看得到的值是不是基本数据类型,如果是,就使用
            //2. 如果 valueOf() 得到的不是基本数据类型,则调用toString()方法,看是不是基本数据类型
            //3. 如果前面2不都得不到基本数据类型,则报错!
            console.log(Number(arr));
            console.log(arr.valueOf());
            console.log(arr.toString());
            console.log(arr + 1); //先valueOf()得到数组,再toString()得到'1,2,3,4'
            console.log(arr - 1); //NaN
            console.log(arr * 1); //NaN
            console.log(arr / 1); //NaN

10. ES5中新增的方法

        var arr = [12,312,3,213,12,3,21];

        //forEach()遍历数组,需要传递一个function
        //function有3个参数
        //  第1个是数组里面的每个元素
        //  第2个是元素的下标
        //  第3个是当前操作的数组
        //可以只写1个,位置是固定的
        //没有返回值,默认是undefined
        var res = arr.forEach(function(item, index, arr) {
            console.log(item);
        });
        console.log(res);


        //将每个数字乘以5,并返回一个新的数组
        var arr = [1,2,3,4,5];

		//map()遍历数组,需要传递一个function
        //function有3个参数
        //  第1个是数组里面的每个元素
        //  第2个是元素的下标
        //  第3个是当前操作的数组
        //可以只写1个,位置是固定的
        //可以将function里面return的东西组成一个新的数组作为返回值
        var newArr = arr.map(function(item, index, arr) {
            return item * 5;
        });
        //箭头函数,ES6阶段再学
        // newArr = arr.map(item => item*5);
        console.log(newArr);


        //将薪资1w以下的去除,返回一个新的数组
        var arr = [12000, 8000, 15000, 18000, 13800];

        //filter() 过滤数组,需要传递一个function
        //function有3个参数
        //  第1个是数组里面的每个元素
        //  第2个是元素的下标
        //  第3个是当前操作的数组
        //可以只写1个,位置是固定的
        //可以将function里面return true;的东西组成一个新的数组作为返回值
        newArr = arr.filter(function(item, index, arr) {
            console.log(item);
            // if (item >= 10000) return true;
            return item >= 10000;
        });
        console.log(newArr);
		

		//判断数组里面有没有薪资刚好1w的
        var arr = [12000, 80000, 15000, 18000, 13800];

        //some() 判断数组里面是否有满足条件的,需要传递一个function
        //function有3个参数
        //  第1个是数组里面的每个元素
        //  第2个是元素的下标
        //  第3个是当前操作的数组
        //  可以只写1个,位置是固定的
        //返回的是一个布尔值,不写return,默认得到false
        //挨个遍历数组中的值,判断其中是否有满足条件的
        //在function里面return true后就停止遍历(break)
        //使用场景:通常用来检测数组里面是否有某个值
        flag = arr.some(function(item, index, arr) {
            // console.log(item);
            // return true; //一旦返回true,后面的就不用遍历了

            return item === 10000;
        });
        console.log(flag);


        //判断数组里面是不是所有人的年龄都大于等于18

        //every() 判断数组里面是否所有元素都满足条件,需要传递一个function
        //function有3个参数
        //  第1个是数组里面的每个元素
        //  第2个是元素的下标
        //  第3个是当前操作的数组
        //  可以只写1个,位置是固定的
        //返回的是一个布尔值,不写return,默认得到false
        //挨个遍历数组中的值,判断其中所有的元素是否满足条件
        //在function里面return false后就停止遍历(break)
        flag = arr.every(function(item, index, arr) {
            return item >= 18;
        });
        console.log(flag);


        //reduce()方法,也会对数组进行遍历,与之前的forEach等不同的是:
        //reduce的每次遍历,都可以拿到上一次遍历的结果

        var arr = [1,2,3,4,5];
        /* 
        prev item
          1   2      3
          3   3      6
          6   4      10
          10  5      15
        */
        //求和:没有为prev设置初始值,默认会将第1个元素的值给prev,所以循环是从第2个元素开始
        var res = arr.reduce(function(prev, item, index, arr) {
            // console.log(prev, item);
            return prev + item;
        });
        console.log(res);

        console.log('-------------');
        /* 
        prev item
          0   1      1
          1   2      3
          3   3      6
          6   4      10
          10  5      15
        */
        var res = arr.reduce(function(prev, item, index, arr) {
            console.log(prev, item);
            return prev + item;
        }, 0); //给prev设置了一个初始值0
        console.log(res);


练习: 请使用reduce()方法将数组去重,返回一个新数组
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值