一、基本概念
数组是什么?
数组
是一个具有相同类型
或者不同类型
的数据有序集合
(可以是不同类型
!!!)
为什么要有数组?
因为我们想要一次性拿到很多个数据
,如果没有数组,就得定义很多的变量去存储。
如何定义数组?
-
字面量定义数组(常用)
var arr = [1,2,3,4,5] ;
-
构造函数定义数组
var arr1 = new Array(1,2,3,4,5) ;
数组的两个重要属性
-
length(长度)
只要定义了一个
数组
,数组里面就会有一个默认的属性
叫length
,它代表着数组的长度
-
索引(下标)
索引
也被称作下标
,通常情况下只要我们知道了索引
,就可以拿到这个数组对应这个索引的值
。length
若是5
,下标就是从0
到4
。
示例:
var arr = [1,2,3,4,5];
console.log(arr.length);
// 结果为5
console.log(arr[2]);
// 结果为3
遍历数组
循环遍历数组
的时候,循环变量
一般都是对应数组的索引
。
// 正向遍历
var arr = [1,2,3,4,5];
for ( var i = 0; i < arr.length; i++ )
{
console.log(arr[i]);
}
// 反向遍历
var arr = [1,2,3,4,5];
for ( var i = arr.length - 1; i >= 0; i-- )
{
console.log(arr[i]);
}
二、数组的增删改查
var arr = [1,2,3,4,5] ;
以arr
数组为例,进行增删改查操作。
增
-
在数组的末尾加一个数
arr[arr.length] = 6; // arr.length值为5,中括号内相当于写了一个5 console.log(arr); // 1 2 3 4 5 6 console.log(arr.length);// 6
-
在数组的头部加一个数
// 先把所有的数统统往后移一个位置,然后再在第一个位置去改成要加的值 for ( var i = arr.length - 1; i >= 0; i-- ) { arr[i+1] = arr[i]; } arr[0] = 6; console.log(arr); // 6 1 2 3 4 5 console.log(arr.length); // 6
-
在数组的中间加一个数
// 在arr[2]的位置增加一个新的数,原来的数依次往后排 for ( var i = arr.length - 1; i >= 2; i-- ) { arr[i+1] = arr[i]; } arr[2] = 6; console.log(arr); // 1 2 6 3 4 5 console.log(arr.length); // 6
删
-
数组末尾删除一个
arr.length--; // 实现 末尾删除一个元素 console.log(arr); // 1 2 3 4 console.log(arr.length); // 4 console.log(arr[4]); // undefined
-
数组头部删除一个
for ( var i = 1; i < arr.length; i++ ) { arr[i - 1] = arr[i]; } // for 循环的作用是把第二个元素挪到第一个,把第三个元素挪到第二个...以此类推 arr.length--; // 然后删除末尾的多余元素 console.log(arr); // 2 3 4 5
-
数组中间删除一个
// 删除2号位数字3,原理跟上面数组头部删除差不多 for ( var i = 3; i < arr.length; i++ ) { arr[i - 1] = arr[i]; } arr.length--; console.log(arr); // 1 2 4 5
改
只要知道了下标,直接就可以改相应下标的值
把数组当中的4改为6:
for ( var i = 0; i < arr.length; i++ )
{
if ( arr[i] == 4 )
{
arr[i] = 6;
}
}
console.log(arr); // 1 2 3 6 5
查
查其实就是遍历或者输出某一个值
输出数组中的数字4:
for( var i = 0; i < arr.length; i++ )
{
if ( arr[i] == 4 )
{
console.log(arr[i]); // 结果为4
}
}
注意:
改和查知道了下标怎么都可以玩,但是不知道下标的情况下,我们需要去遍历一下数组。
数组不存在的索引
,对应的值为undefined
。
console.log(arr[5]);
// 结果为undefined
三、数组练习
-
数组求和
var sum = 0; var arr = [1,2,3,4,5]; for ( var i = 0; i < arr.length; i++ ) { sum += arr[i]; } console.log(sum);
-
求数组最大值,最小值,平均值
var arr = [1,2,3,4,5]; var max = arr[0]; var min = arr[0]; var sum = 0; for ( var i = 0; i < arr.length; i++ ) { if ( arr[i] > max ) { max = arr[i]; } if ( arr[i] < min ) { min = arr[i]; } sum += arr[i] } console.log( max , min , sum/arr.length );
-
根据班级人数(设为5)输入每个人的分数,求平均值
var arr = [ ]; // 代表声明一个空数组 var sum = 0; for ( var i = 0; i < 5; i++ ) { arr[i] = parseInt( prompt("请输入第"+(i+1)+"位的分数") ); // 两边加号是因为拼接字符串 sum += arr[i]; } console.log( arr , sum/arr.length );
-
反转数组
引入一个新数组实现反转
var arr = [1,2,3,4,5]; var newArr = [ ]; for ( var i = arr.length - 1; i >= 0; i-- ) { newArr[ newArr.length ] = arr[i]; } console.log( newArr );
翻转数组不用新数组,在原数组基础上进行翻转
for ( var i = 0; i < arr.length/2; i++ ) { var temp = arr[ i ]; // temp是一个中间值 arr[ i ] = arr[ arr.length - 1 - i ]; arr[ arr.length - 1 - i ] = temp; } console.log(arr);
不使用中间值,在原数组基础上进行翻转(进阶)
for ( var i = 0; i < parseInt(arr.length/2); i++ ) { arr[i] = arr[i] + arr[arr.length - 1 - i]; arr[arr.length - 1 - i] = arr[i] - arr[arr.length - 1 - i]; arr[i] = arr[i] - arr[arr.length - 1 - i]; } console.log(arr);
-
找出数组中的所有偶数打印,奇数生成新数组
var arr = [2,6,12,23,44,56,78,67,13,41]; var newArr = []; for(var i = 0; i < arr.length; i++) { if(arr[i] % 2 == 0) { console.log(arr[i]) } else { newArr[newArr.length] = arr[i]; } } console.log(newArr);
-
有一个从小到大排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
var arr = [10,20,30,40,50,60,70,80,90,100,110]; var num = parseInt(prompt('输入一个数字')); var index = 0; // 这个for循环是找到要插入的位置 for(var i = 0; i < arr.length; i++) { if(num >= arr[i] && num <= arr[i+1]) { index = i + 1; } } // 这个for循环是把插入位置往后的所有值都后移一位 for(var i = arr.length - 1; i >= index; i--) { arr[i+1] = arr[i]; } // 插入值 arr[index] = num; console.log(arr);
将上面的代码更加完善一下,加入头尾两种直接插入情况:
var arr = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110]; var num = parseInt(prompt('输入一个数字')); var index = 0; // 头插 if (num < arr[0]) { index = 0; for (var i = arr.length - 1; i >= index; i--) { arr[i + 1] = arr[i]; } arr[index] = num; } // 尾插 else if (num >= arr[arr.length - 1]) { index = arr.length; arr[index] = num; } // 其他位置插入 else { for (var i = 0; i < arr.length; i++) { if (num >= arr[i] && num <= arr[i + 1]) { index = i + 1; } } for (var i = arr.length - 1; i >= index; i--) { arr[i + 1] = arr[i]; } arr[index] = num; }