数组
基本类型的变量只能存一个值,数组可以存一组值。
使用数组的最大好处就是可以对数组里面的数据进行批量操作。
基本概念
-
数组,一组值,数组可以存储多个值(每一项都可以保存任何类型的数据),数组的最大特点就是__有序__
-
下标(索引,键,key),为了能够拿到对应位置的数据所给的标识。
索引都是从0开始。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QLvFdB9q-1637113778468)(image-20211115092815819.png)]
-
元素:下标和值的组合叫元素。
-
数组只有一个属性,就是length
-
类和对象的概念:
JS中数组是对象类型,其他语言当中数组是基本数据类型。
面向对象语言中都有类和对象的概念。ES中没有类的概念。
- 类:具有相同特征的事物的总称。
- 每个类里面的东西都有一些共同的特征,这些特征我们叫属性。(空调有牌子、功率)
- 每个类里面都有一些共有的行为,这些行为我们叫方法。空调-》制冷。
- 对象:是类的具体化。
- 类和对象的关系:根据类(模板)创造对象(根据模板创造出来的实体),创造出来的对象里面同样也有属性和方法。
- 类:具有相同特征的事物的总称。
数组的创建
-
使用Array来创建。
<script> var arr = new Array(); console.log(typeof arr); </script>
new是操作符,表示调用后面的内容,创建一个对象。
new后面是Array(可以暂时将Array看成是一个类),
new Array
我要创建一个对象,这个对象是数组,我要创建一个数组对象。在Array中传递数组中应该包含的项。
var colors = new Array('red','blue','green'); console.log(colors);
数组中每个元素的值可以是表达式。
var c = 'green'; var colors = new Array('red' + 1, c); console.log(colors);
如果Array()中只有一个元素并且是数值,将会创建有
数值
个数的元素的数组。如果只有一个其他类型的值那么只会创建只有一个元素的数组。var arr = new Array(3); console.log(arr); var arr1 = new Array('a'); console.log(arr1);
可以省略new操作符。
var arr = Array('red','green','blue'); console.log(arr);
-
使用数组字面量方法
数组的字面量方式声明数组,一对方括号,里面包含数组中的每一项,每一项之间使用逗号进行分隔。
var arr = ['red','green','blue']; console.log(arr); var arr1 = [3]; console.log(arr1);
数组元素的个数
数组中的元素的个数始终保存在数组的length属性中。
var arr = ['red','green','blue'];
console.log(arr.length);
数组中length属性的值始终大于等于0。
数组的最后一项的索引始终是length-1
var arr = ['red','green','blue','pink'];
console.log(arr.length);
数组的基本操作
查看元素的值
数组[下标]
这种方式来访问对应下标的值,使用数组首先就是要找下标。
读取时超过了最大的下标,那么值为undefined
var arr = ['red','green','blue','pink','black','white'];
console.log(arr[100]);
中括号里面可以放置的是任何返回数值或数值型字符串的表达式。
var arr = ['red','green','blue','pink','black','white']
console.log(arr['0']);//red
console.log(arr[25-25]);//red
console.log(arr[arr.length]);//undefined
获得数组中最后一个元素的值。
arr[arr.length-1]
可以通过for循环配合length属性将所有的值拿出来,这种操作我们称为遍历。
var arr = ['red','green','blue','pink','black','white','yellow'];
/* 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 (var i = 0; i < arr.length;i++){
/* console.log(i); */
console.log(arr[i]);
}
怎么倒叙输出呢?
<script>
var members = ['张三', '李四', '王五', '赵六', '田七'];
for (var i = members.length - 1; i >= 0; i--) {
/* console.log(i); */
console.log('来发苹果'+ members[i]);
}
</script>
增加元素
在不同的位置增加
-
在末尾增加
直接使用
下标
添加var members = ['张三', '李四', '王五', '赵六', '田七']; members[5] = '华华的baby'; console.log(members);
当设置的时候超过了最大的下标,那么数组最大下标为设置后的下标,数组长度最大的
下标+1
var members = ['张三', '李四', '王五', '赵六', '田七']; members[5] = '华华的baby'; members[60] = '熊键'; console.log(members[60]); console.log(members.length);
使用
length属性
始终向末尾添加元素
arr[arr.length] = xxx
这就是给数组的末尾添加元素,增加数组长度。
arr[arr.length-1] = xxx
这就是给数组的末尾元素重新赋值。最后一个下标是
length-1
,那length就是比当前的最大下标多一。var members = ['张三', '李四', '王五', '赵六', '田七']; members[members.length] = '小华华'; members[members.length] = '小熊'; console.log(members);
-
在开始的地方加
<script> var colors = ['red','blue','green']; /* colors[3] = colors[2]//[red,blue,green,green] colors[2] = colors[1]//[red,blue,blue,green] colors[1] = colors[0]//[red,red,blue,green] colors[0] = 'pink';//[pink,red,blue,green] */ /* i=3 3>0 true colors[3] = colors[2]//colors[3] = green i=2 2>0 true colors[2] = color[1]//colors[2] = blue i=1 1>0 true colors[1] = colors[0]//colors[1] = red i=0 0>0 false */ for (var i = colors.length;i>0;i--){ // console.log(i,i-1); colors[i] = colors[i-1]; } colors[0] = 'pink'; console.log(colors); </script>
-
在中间的位置添加
<script> var colors = ['red', 'blue', 'green']; //var colors = ['red','blue','pink','green']; /* i=3 3>0 true i=2 false color[3] = colors[2]//red,blue,green,green i=2 2>0 true i=2 true break; */ for (var i = colors.length; i > 0; i--) { //挪到指定下标的时候就不挪了 if (i==2){ break; } colors[i] = colors[i - 1]; } colors[2] = 'pink'; console.log(colors); </script>
另外一种方法:
/* i=3 3>=2 true colors[3] = colors[2]//colors[3] = green//red,blue,green,green; */ for (var i = colors.length;i>2 ;i--){ colors[i] = colors[i-1]; } colors[2] = 'dark'; console.log(colors);
修改元素
数组[下标]='值'
删除元素
-
删除末尾元素
<script> var colors = ['red', 'blue', 'green']; // colors.length=2; colors.length--; colors.length--; console.log(colors); </script>
-
删除开头的
[red,blue,green]
var colors = ['red', 'blue', 'green']; /* i=1 1<3 true colors[0] = colors[1]//[blue,blue,green] i=2 2<3 true colors[1] = colors[2]//[blue,green,green] */ for (var i = 1; i < colors.length; i++) { colors[i - 1] = colors[i]; } colors.length--;//[blue,green] console.log(colors);
-
删除指定位置的元素
删除下标为1的元素。
<script> var colors = ['red','blue','green','yellow']; /* i=2 2<4 true colors[1] = colors[2]//[red,green,green,yellow] i=3 3<4 true colors[2] = colors[3]//[red,green,yellow,yellow] i=4 4<4 false */ for (var i = 2; i < colors.length;i++){ colors[i-1] = colors[i]; } colors.length--; console.log(colors); </script>
多维数组
数组的每个元素的值都可以是任意类型的数据,所以数据也可以是数组。
维:维度。
几层中括号。
<script>
var arr = [
1,2,[
3,4
]
];
</script>
使用二维数组就是一层一层的往里面找。
数组一般来说最多到三层,一维二维用的比较多,最多三维。但是不管多少维都是一层一层往里面找。
练习题
-
数组求和。
[1,2,3,4,5,6,7,8,9,10]
求和。<script> var arr = [1,2,3,4,5,6,7,8,9,10]; var sum = 0;//用来存放和的变量。 for (var i = 0 ; i < arr.length ; i++){ sum += arr[i]; } console.log(sum); </script>
-
求数组中的最大值和最小值
[1,2,3,4,5,6,7,100,2,1,2,11,-4,87847,8848]
var arr = [2, -4, 87847, 8848]; //2 var max = arr[0]; /* i=0 0<4 true 2>2 false i=1 1<4 true -4>2 false i=2 2<4 true 87847>2 true max = 87847 i=3 3<4 true 8848>87847 false i=4 4<4 false */ //获得最大值 for (var i = 0; i < arr.length; i++) { if (arr[i] > max) { max = arr[i]; } } var min = arr[0]; for (var i = 0; i < arr.length; i++) { if (arr[i] < min) { min = arr[i]; } } console.log(min); console.log(max);
-
反转数组
[1,2,3,4,5,6,7,100,2,1,2,11,-4,87847,8848]
-
方法一:用新数组作为容器
var arr = ['a','b','c','d'];//d c b a var newArr = [];//用来放置倒序之后的数组 //第一种方法:用新数组作为容器的,倒序输出。 for(var i = arr.length-1 ; i>=0;i-- ){ //这里比较重要,而且一定i>=0,不然少一位。 // console.log(arr[i]); newArr[newArr.length] = arr[i]; } console.log(newArr);
-
方法二:用自身作为容器
['a','b','c','d','e','f'] arr[0] arr[5] arr[1] arr[4] arr[2] arr[3]
<script> var arr = ['a','b','c','d'];// //先找下标。 /* i=0 0<2 true 0 3 i=1 1<2 true 1 2 */ for (var i =0 ; i < arr.length/2 ; i++){ // 1.找到要交换的下标 console.log(i,arr.length-1-i); // 2. 交换他们 var tmp = arr[i]; arr[i] = arr[arr.length-1-i]; arr[arr.length-1-i] = tmp; } console.log(arr); </script>
-
-
数组合并
-
方法一:新数组中合并两个数组
<script> //方法一:新数组中合并两个数组 var arr1=[1,2]; var arr2=[5,6]; //创建一个空数组,作为容器。 var newArr = []; //遍历第一个数组,将第一个数组中的每个值追加到新容器中。 /* i=0 0<2 true newArr[0] = arr1[0]//[1] i=1 1<2 true newArr[1] = arr1[1]//[1,2] i=2 2<2 false */ for (var i = 0 ;i < arr1.length; i++){ newArr[newArr.length] = arr1[i]; } /* j=0 0<2 true newArr[2] = arr2[0]//[1,2,5] j=1 1<2 true newArr[3] = arr2[1]//[1,2,5,6] j=2 2<2 false */ for (var j = 0 ; j < arr2.length ; j++){ newArr[newArr.length] = arr2[j]; } console.log(newArr); </script>
-
方法二:原数组中合并另外一个数组
<script> var arr1=[1,2];//arr1作为容器 var arr2=[5,6]; /* 要将arr2里面的内容放到arr1里面去,遍历的是arr2,放的是arr1 i=0 0<2 true arr1[2] = arr2[0] //[1,2,5] i=1 1<2 true arr1[3] = arr2[1] //[1,2,5,6] i=2 2<2 false */ for (var i = 0 ; i < arr2.length ; i++){ arr1[arr1.length] = arr2[i]; } console.log(arr1); </script>
-
数组去重并排序
// 数组去重并排序 function arrSortUnrepeat(arr, newArr) { // 去重 for (var i = 0; i < arr.length; i++) { var flag = true; for (var j = 0; j < newArr.length; j++) { if (newArr[j] == arr[i]) { flag = false; break; } } if (flag) { newArr[newArr.length] = arr[i]; } } // console.log(newArr); // 排序 for (var i = 0; i < newArr.length - 1; i++) { for (var j = 0; j < newArr.length - 1 - i; j++) { var temp; if (newArr[j] > newArr[j + 1]) { temp = newArr[j]; newArr[j] = newArr[j + 1]; newArr[j + 1] = temp; } } } return newArr; } var arr1 = [9, 5, 8, 9, 1, 2, 5, 9, 7, 74, 1]; var arr2 = []; var res = arrSortUnrepeat(arr1, arr2); console.log(res);
-