JS笔记1.4--数组

1.数组的基本属性

#数组的创建,添加元素和数组的长度

<script type="text/javascript">
	/*
	* 数组
	* 数组也是对象,也是用来存储数据的
	* 区别是:普通对象一般使用字符串作为属性名,数组使用下标作为索引(从0开始)操作元素
	*/ 
	var arr = new Array(); //创建数组对象
	console.log(typeof arr);//使用typeof检查一个数组时,返回object(数组也是对象)
	/*
        * 1.如果数组中对应的索引中没有存储数据,默认存储的是undefined
	* 2.向数组中添加元素
	* 语法: 数组名[索引] = 值
	* 3.读取数组中的元素
	* 语法: 数组名[索引]
	* 4.如果读取的索引大于数组长度,不会报错,返回undefined
        * 5.如果数组的存储空间不够,数组会自动扩容
        * 6.数组可以存储不同类型的数据
        * 7.数组分配的存储空间不一定连续:如果存储的都是相同类型的数据,则会尽量分配连续的存储空间;
            如果存储的数据类型不同,则不会分配连续的存储空间
	*/ 
        arr[0] = 1;
	arr[1] = 2;
	console.log(arr); //输出是 [1, 2]
	console.log(arr[1]);//输出是 2
	console.log(arr[5]);//输出是 undefined
	
	/*
	* 获取数组长度,使用length属性
	* 语法: 数组名.length
	* 对于连续数组,使用length能获取数组长度
	* 对于非连续数组,使用length能获取数组的最大索引+1
	*/ 
        console.log(arr.length); // 2
	
	/*
	* 修改数组的长度
	*  -- 如果修改后的数组长度大于原数组的长度,则多出来的元素为0
	*  -- 反之,如果修改后的length小于原长度,则删除多出的元素
	*/ 
	arr.length = 5; //将原长度为2的数组修改成长度为5
	console.log(arr.length);// 5
	console.log(arr);//[1, 2] 大于原数组长度的元素值初始化为0
	arr.length = 1;
	console.log(arr);//输出是 [1]
	
	//向数组的最后位置添加元素
	//最后位置 = length 
	//语法: 数组名[数组名.length] = 值
	arr[arr.length] = 2;
	console.log(arr);//[1, 2]
</script>

2. 使用字面量和构造函数创建数组,数组的元素类型任意

        // 1. 通过构造函数创建数组
        // let 变量名称 = new Array(size); 创建一个指定大小数组
        // let 变量名称 = new Array();     创建一个空数组
        // let 变量名称 = new Array(data1, data2, ...);     创建一个带数据的数组

        // 2. 通过字面量创建数组
        // let 变量名称 = [];  创建一个空数组
        // let 变量名称 = [data1, data2, ...];  创建一个带数据的数组
<script type="text/javascript">
	/*
	* 使用字面量创建数组
	*  语法: 数组名 = []
	*/ 	
	//使用字面量创建数组,可以在创建时指定数组中的元素
	var arr1 = [1,2,3,4,5];
	 
	/*使用构造函数创建数组,也可以添加元素,将要添加的元素作为构造函数要传递的参数
	*元素之间使用","隔开
	*/ 
	var arr2 = new Array(1,2,3);
	
	/*
	* 使用字面量创建数组和使用构造函数创建数组的区别:
	*/ 
	arr1 = [10]; // 数组中只有一个元素 10
	console.log(arr1.length); // 1
	arr2 = new Array(10); // 数组长度是 10
	console.log(arr2.length); // 10
	
	/*
	* 数组中的元素类型值任意,也可以是对象 或者函数,也可以是数组
	*/ 
        var arr3 = [{name:"孙悟空"},{name:"白龙马"},{name:"唐三藏"}]; //元素是 对象
	console.log(arr3); // [Object, Object, Object]
	console.log(arr3[1].name); // 输出是 白龙马
	
	var arr4 = [function(){},function(){},function(){}]; // 元素是 函数
	console.log(arr4[0]);// 输出是 function(){}
	
	var arr5 = [[1,2,3],[4,5,6],[7,8,9]];
	console.log(arr5[1]);//输出是 [4,5,6]
</script>

3.数组的解构赋值

        let arr = [1, 3, 5];
        let [a, b, c] = arr;
        console.log("a = " + a); a=1
        console.log("b = " + b); b=3
        console.log("c = " + c); c=5

        1.在数组的解构赋值中, 等号左边的格式必须和等号右边的格式一模一样, 才能完全解构
        let [a, b, c] = [1, 3, 5];
        let [a, b, [c, d]] = [1, 3, [2, 4]];
        let [a,b,c] = [1,2,[3,4]]
        console.log(c) //[3,4]

        2.在数组的解构赋值中, 左边的个数可以和右边的个数不一样
        let [a, b] = [1, 3, 5];
        console.log("a = " + a); a=1
        console.log("b = " + b); b=3

        3.在数组的解构赋值中, 右边的个数可以和左边的个数不一样
        let [a, b, c] = [1];
        console.log("a = " + a); a=1
        console.log("b = " + b); b=undefined
        console.log("c = " + c); c=undefined

        4.在数组的解构赋值中,如果右边的个数和左边的个数不一样, 可以给左边指定默认值
        let [a, b = 666, c = 888] = [1];
        console.log("a = " + a); a=1
        console.log("b = " + b); b=666
        console.log("c = " + c); c=888

        5.在数组的解构赋值中, 如果左边的个数和右边的个数不一样, 那么如果设置默认值会被覆盖
        let [a, b = 666] = [1, 3, 5];
        console.log("a = " + a); a=1
        console.log("b = " + b); b=3

        6.左右个数相同,默认值也被覆盖的情况
        let [a, b = 666,c] = [1, 3, 5];
        console.log("a = " + a); a=1
        console.log("b = " + b); b=3
        console.log(c);          c=5
        
        7.使用ES6的扩展运算符打包剩余的数据
        扩展运算符:... 
        如果用到了...,则...必须放在最后
        let [a, ...b] = [1, 3, 5];
        console.log("a = " + a);//a=1
        console.log(b);//b=[3,5]

4. 数组的方法之:添加push()和unshift(),删除pop()+shift()

<script type="text/javascript">
	/*1. 添加元素
	* 1.1. 向数组的末尾添加新元素 push()方法:
	*   向数组的末尾添加一个或者多个元素,并返回新的数组的长度
	*   可以将要添加的元素作为方法的参数传递,这样这些元素就会自动添加到数组的末尾
    *   push方法可以接收1个或多个参数
	*/ 
        var arr = ["孙悟空","猪八戒","沙和尚"];
	var result = arr.push("白龙马","唐僧");
	console.log(arr);//输出是 ["孙悟空", "猪八戒", "沙和尚", "白龙马", "唐僧"]
	console.log(result); //返回数组的新长度 5
	
	/* 1.2 向数组的开头添加新元素 可以接受1+个参数
	* unshift()方法:
	*   向数组的开头添加一个或者多个元素,并返回新的数组的长度
	*   向数组的前边插入元素,原来数组的元素索引会依次调整
	*/ 
	result = arr.unshift("铁扇公主","红孩儿");
	console.log(arr); // ["铁扇公主", "红孩儿", "孙悟空", "猪八戒", "沙和尚", "白龙马"]
	console.log(result); // 6

	/*2. 删除元素
	* 2.1 删除数组末尾的元素 pop()方法:
	*   删除数组的最后一个元素,并将被删除的元素作为返回值返回
	*/ 
        result = arr.pop();
	console.log(arr);//输出是 ["孙悟空", "猪八戒", "沙和尚", "白龙马"]
	console.log(result); // 唐僧
	

	
	/*2.2 删除数组开头的第一个元素
	* shift()方法:
	*   删除数组的第一个元素,并将被删除的元素作为返回值返回
	*/
        result = arr.shift();
	console.log(arr); //["红孩儿", "孙悟空", "猪八戒", "沙和尚", "白龙马"]
	console.log(result); // 铁扇公主
</script>

5.  数组的方法之:修改和删除splice()

splice()方法,只传递两个参数是删除操作,传递三个及以上参数是替换操作
1.替换元素
参数1: 从什么位置开始
参数2: 需要替换多少个元素
参数3开始: 新的内容
let arr = ["a", "b", "c"];
arr.splice(1, 2, "d", "e");
console.log(arr);  ["a", "d", "e"]

2.删除元素
参数1: 从什么位置开始
参数2: 需要删除多少个元素
let arr = ["a", "b", "c"];
arr.splice(1, 1);
console.log(arr); ["a"]

	/*
	* splice()方法:删除元素会修改原数组的索引和长度
	*  删除数组中的指定元素,并向数组添加新元素
	*  影响原数组,会将指定元素从原数组中删除,并将被删除的元素作为返回值返回
	*  参数:
	*    第一个参数:表示从第几个元素开始删除
	*    第二个参数:一共删除几个元素
	*    第三个参数及以后:替换删除的元素
	*/
	result = arr.splice(0,2); //从第一个元素开始删除,一共删除两个元素
	console.log(result); // ["孙悟空", "唐僧"]
	console.log(arr); // ["猪八戒", "牛魔王"]

6.数组的方法之:清空数组 

let arr = [1, 2, 3, 4, 5];
1. arr = [];
2. arr.splice(0, arr.length)
3. arr.length = 0;

7.数组的方法之:将数组转换成字符串 

    1. 使用toString()方法,会将字符串返回,不会改变原数组
        let arr = [1,2,3,4,5];
        let res =arr.toString();
        console.log(res) // 1,2,3,4,5
        console.log(arr) //(5) [1, 2, 3, 4, 5]
        console.log(typeof res) //string
        let arr1 = ['a', 'b', 'c'];
        console.log(arr1.toString());//a,b,c

    2. 使用join()方法:在没有传递参数的情况下,join()方法等同于toString()方法
       join方法如果传递了参数, 就会将传递的参数作为元素和元素的连接符号
       join()方法同样返回字符串,不会改变原数组
        let arr = [1,2,3,4,5];
        let res = arr.join('+');
        console.log(res) //1+2+3+4+5
        console.log(arr) //(5) [1, 2, 3, 4, 5]
        console.log(typeof res) //string

8.数组的方法之:数组拼接 

         1. 数组不能使用 + 进行拼接,“+” 会将数组先转换成字符串再拼接
         let arr1 = [1, 3, 5];
         let arr2 = [2, 4, 6];
         let res= arr1 + arr2;
         console.log(res);// 1,3,52,4,6
         console.log(typeof res);//string

        2. 使用concat()方法拼接数组,不会改变原始数组,而是将拼接后的新数组返回
        let arr1 = [1, 3, 5];
        let arr2 = [2, 4, 6];
        let res = arr1.concat(arr2);
        console.log(res);// [1, 3, 5, 2, 4, 6]
        console.log(typeof res);// object

        3. 使用扩展运算符...
        扩展运算符在解构赋值中(等号的左边)表示将剩余的数据打包成一个新的数组
        扩展运算符在等号右边, 那么表示将数组中所有的数据解开, 放到所在的位置
        let arr1 = [1, 3, 5];
        let arr2 = [2, 4, 6];
        let res = [...arr1,...arr2]
        console.log(res) //[1, 3, 5, 2, 4, 6]

9.数组的方法之:内容反转 

        reverse()方法:将数组的元素倒序排列,会修改原数组
        let arr = [1, 2, 3, 4, 5];
        let res = arr.reverse()
        console.log(res) //[5, 4, 3, 2, 1]

10.数组的方法之:slice()方法截取数组指定部分的内容

        slice方法是包头不包尾(包含起始位置, 不包含结束的位置),不会修改原数组
        let arr = [1, 2, 3, 4, 5];
        let res = arr.slice(1, 3)
        console.log(res); [2,3]
        console.log(arr); [1, 2, 3, 4, 5]


	/*
	* slice方法
	*   从数组中返回已有的选定元素
	*   语法:数组名.slice(start,end)
	*   start是要选取的开始位置。
	*   end是要选取的结束位置(可选)。
	*   end可以取负值, -1 表示 数组的最后一个元素
	*   将选取的(start,end-1)数组返回,但并不改变原数组。
	*/
        var arr =["孙悟空","唐僧","猪八戒","牛魔王"];
	var result = arr.slice(0,2);
	console.log(result); // ["孙悟空", "唐僧"]
	result = arr.slice(1); //end不写,选取从start开始到最后一个元素
	console.log(result);// ["唐僧", "猪八戒", "牛魔王"]
	result = arr.slice(1,-1); 
	console.log(result);// ["唐僧", "猪八戒"]

参考文章:数组遍历forEach、map、filter、find、some、every、reduce等区别

11.数组的方法之:查找某个元素的位置

indexOf()和lastIndexOf() 

        let arr = [1, 2, 3, 4, 5, 3];
        // indexOf方法如果找到了指定的元素, 就会返回元素对应的位置。如果没有找到,返回-1
        // 注意点: indexOf方法默认是从左至右的查找, 一旦找到就会立即停止查找(找到该元素在数组中第一次出现的位置)
        // 传递一个参数:需要查找的元素
        let res = arr.indexOf(3); //res=2
        let res = arr.indexOf(6); //res=-1
        // 参数1: 需要查找的元素
        // 参数2: 从什么位置开始查找
        let res = arr.indexOf(3, 4); //res=5
        // 注意点: lastIndexOf方法默认是从右至左的查找, 一旦找到就会立即停止查找
        let res = arr.lastIndexOf(3); //res=5
        let res = arr.lastIndexOf(3, 4); //res=2

findIndex()和find() 

       findIndex()查找数组中某个元素的索引。找到就返回索引值,找不到返回-1
        let arr = [3, 2, 6, 7, 6];
        let index = arr.findIndex(function(value,index,arr){
            if(value === 6){
                return true;
            }
        })
        console.log(index);//2

        //find()查找数组中的元素值。找到返回元素值,找不到返回undefined
        let arr = [3, 2, 6, 7, 6];
        let value = arr.find(function(value,index,arr){
            if(value === 1){
                return true;
            }
        })
        console.log(value);//undefined

12.数组的方法之:判断数组中是否包含某个元素includes() 

        1.通过indexOf和lastIndexOf的结果, 返回-1就是不存在
        let arr = [1, 2, 3, 4, 5];
        let res = arr.indexOf(8); //-1
        let res = arr.lastIndexOf(8); //-1
        2. includes()方法,存在返回true,不存在返回false
        let res = arr.includes(4);
        console.log(res);//res=true

13.数组的方法之:遍历时删除整个数组 

使用splice方法:删除元素会修改原数组的长度和元素的索引值

        let arr =[1,2,3,4,5];
        for(let i =arr.length - 1; i >=0;i--){
            arr.splice(i,1);
            console.log(arr)
        }

 

使用delete方法: 

        let arr =[1,2,3,4,5];

        //使用delete方法不会修改数组的长度,被删除的数组索引位置的元素为empty
        for(let i = 0 ; i < arr.length ; i ++){
            delete arr[i];
            console.log(arr);
        }

 

14.数组的方法之:数组的遍历

 数组不使用for-in方法遍历:

for-in方法是遍历对象的专用方法。因该方法具有无序的性质,所以不适用于对数组进行排序。

使用for-of遍历数组:

        let arr = [1,2,3,4,5];
        for(let value of arr){
            console.log(value)
        }

 

使用Array的forEach方法遍历:

        let arr = [1,2,3,4,5];
         //使用Array的forEach方法。传入的第一个参数是数组的元素值,第二个参数是数组的索引,第三个参数是要遍历的数组
        arr.forEach(function (value,key,arr) {
            console.log(value +" " + key + " " + arr)
        })

 

15.数组的方法之:过滤filter()

        //过滤不满足条件的元素,并将满足条件的元素添加到新数组中并返回
        let arr = [3, 2, 6, 7, 6];
        let newArr = arr.filter(function (value,index,arr) {
            if(value %2 ===0){
                return true;
            }
        })
        console.log(newArr);//[2, 6, 6]

16.数组的方法之:排序sort()

        //如果数组的元素都是数值型
        let arr = [3, 2, 6, 7, 1];
        arr.sort(function (a,b) {
            //如果需要升序排序, 那么就返回a - b;
            //如果需要降序排序, 那么就返回b - a;
            return b-a;
        });
        console.log(arr);// [7, 6, 3, 2, 1]

        //如果数组的元素是对象型,要比较对象.属性值的大小
        let arr=[{age:34},{age:12},{age:1},{age:100}]
        arr.sort(function (o1,o2) {
            return o1.age-o2.age;
        });
        console.log(arr);
        // 0: {age: 1}
        // 1: {age: 12}
        // 2: {age: 34}
        // 3: {age: 100}

17. 二维数组 

二维数组:数组的每一个元素都是一个数组

在定义二维数组的时候, 将来需要存储多少个一维数组, 就写上多少个[]即可

let arr = [[],[]];

练习:

<script type="text/javascript">
	/*
	* 数组遍历的练习 :
	*   找到数组中年龄大于18的元素,存入新的数组中并返回
	*/
        function Person(name,age)
	{
		this.name = name;
		this.age = age;
	}
	var p1 = new Person("张三",17);
	var p2 = new Person("李四",27);
	var p3 = new Person("王五",14);
	var p4 = new Person("赵六",20);
	var p5 = new Person("招财",15);
	var p6 = new Person("进宝",31);
	
	var arr = [p1,p2,p3,p4,p5,p6];
	
	function getAdult(array)
	{
		var newArr = [];
			
		for(var i = 0 ; i < array.length ; i++)
		{
			if(array[i].age >= 18)
			{
				newArr.push(array[i].name) ;
			}
		}
		return newArr;		
	}
	var result = getAdult(arr);
	console.log(result);// 输出是 ["李四", "赵六", "进宝"]
</script>

练习:删除一个数组中的重复的元素,并返回没有重复的元素的数组

<script type="text/javascript">
	/*
	* 思路:对数组进行两次遍历,如果第二次遍历的元素与第一次的重复,删除第二个
	*/
        var arr= [1,2,2,3,3,2,2,1,4,3,3,4,4,1,5,5];
	for(var i = 0 ; i < arr.length; i ++)
	{
		for(var j = i + 1 ; j < arr.length ; j ++)
		{
			if(arr[i] == arr[j])
			{
				/*当删除j元素之后,后边的元素会自动补位,此时
				不会再比较当前位置的元素,会有漏网之鱼,
				所以需要再比较一次当前j位置的元素
				*/
				arr.splice(j,1);
				j--;
			}
		}
	}
	console.log(arr); // [1, 2, 3, 4, 5]
</script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值