1、数组的概念
所谓数组,就是将多个元素(通常是同一类型)按一定顺序排列放到一个集合中,那么这个集合我们就称之为数组。
2、数组的定义
数组是一个有序的列表,可以在数组中存放任意的数据,并且数组的长度可以动态的调整。
3、通过字面量创建数组
// 创建一个空数组
var arr1 = [];
// 创建一个包含3个数值的数组,多个数组项以逗号隔开
var arr2 = [1, 3, 4];
// 创建一个包含2个字符串的数组
var arr3 = ['a', 'c'];
4、获取数组元素
(1)、数组的取值
// 格式:数组名[下标] 下标又称索引,是从0开始的
// 功能:获取数组对应下标的那个值,如果下标不存在,则返回undefined。
var arr = ['red', 'green', 'blue'];
arr[0]; // red
arr[2]; // blue 等同于arr[arr.length - 1]
arr[3]; // 这个数组的最大下标为2,因此返回undefined
(2)、数组的长度
// 可以通过数组的length属性获取数组的长度
console.log(arr3.length);
// 可以设置length属性改变数组中元素的个数
arr3.length = 0;
5、遍历数组
遍历:遍及所有,对数组的每一个元素都访问一次就叫遍历。
// 顺向遍历
for(var i = 0; i < arr.length; i++) {
// 数组遍历的固定结构
}
// 反向遍历,先打印最后一个
for (var i=arr.length-1;i>=0;i--){
}
6、数组中新增元素
格式:数组名[下标/索引] = 值;
// 如果下标有对应的值,会把原来的值覆盖,如果下标不存在,会给数组新增一个元素。
var arr = ["red", "green", "blue"];
// 把red替换成了yellow
arr[0] = "yellow";
// 给数组新增加了一个pink的值
arr[3] = "pink";
7、案例
// 案例一:求一组数中的所有数的和和平均值。
var numbers = [35,18,35,90,11,12]
var sum = 0;
var avg;
for (var i=0;i<numbers.length;i++){
sum += numbers[i];
}
avg = sum / numbers.length; // 33.5
// 案例二:求一组数中国的最大值和最小值,以及所在位置(即最大值和最小值在这组数中的位置)
var numbers2 = [65,13,88,10,25]
// 假设数组中的第一个数是最大值
var max = numbers2[0];
var min = numbers2[0];
var maxIndex; // 最大值的索引
var minIndex; // 最小值的索引
for (var i=1;i<numbers2.length;i++){
if (max < numbers2[i]){
max = numbers2[i];
maxIndex = i;
}
if (min > numbers2[i]){
min = numbers2[i];
minIndex = i;
}
}
console.log(min);
console.log(minIndex);
console.log(max);
console.log(maxIndex);
// 如果将第一个数设为最大值或最小值,则存在bug,最大值或最小值的索引即为undefined,因为我们的循环是从1开始的
// 解决方案:设置初始值var maxIndex = 0; var minIndex = 0;
// 案例三:将字符串数组用|或其他符合分割
// 思路:往第二个元素之前加分隔符
var names = ['zs', 'ls','zl','ww'];
var str = names[0];
var seperator = '!' // 定义分割符
for (var i=1;i<names.length;i++){
str = str + seperator + names[i];
}
console.log(str); // 'zs!ls!zl!ww'
//案例四:要求将数组中为0的项去掉,将不为0的值存入一个新的数组,生成新的数组。
var numbers3 = [5,6,89,0,11,0,12,3,0];
// 思路:找到数组中不为0的所有元素,然后将其放入一个新数组中
var newArray = [];
for (var i=0;i<numbers3.length;i++){
if (numbers3[i] !== 0){
newArray[newArray.length] = numbers3[i]; // 不能使用newArray[i] = numbers3[i],因为i不连续
}
}
// 案例五:翻转数组
var numbers4 = [4,5,7,9]
var newArray = [];
for (var i =numbers4.length-1;i>=0;i--){
newArray[newArray.length] = numbers4[i];
}
console.log(newArray); // [9,7,5,4]
// 案例六:冒泡排序
// 冒泡排序是一种简单的排序算法,它重复的走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,走访的工作量是重复的进行直到没有需要交换,也就是该数列已经排序完成,从小到大排列到顶端。
var numbers5 =[97,68,72,29,51,45];
var count = 0; // 记录循环次数
// 外层循环,控制趟数,找到每趟的最大值
for (var i=0;i<numbers5.length - 1;i++){
count++;
// 内存循环,控制比较的次数,并且判断两个数的大小,把小的数往前移动
for (var j=0;j<numbers5.length -1- i;j++){
count++;
// 两两比较,从小到大排序
if (numbers5[j]>numbers5[j+1]){
// 交换位置
var tmp = numbers5[j];
numbers5[j] = numbers5[j+1];
numbers5[j+1] = tmp;
}
}
}
console.log(numbers5); // [29, 45, 51, 68, 72, 97]
console.log(count); // 20
// 优化
var numbers5 =[97,68,72,29,51,45];
var count = 0; // 记录循环次数
// 外层循环,控制趟数,找到每趟的最大值
for (var i=0;i<numbers5.length - 1;i++){
var isSort = true;
count++;
// 内存循环,控制比较的次数,并且判断两个数的大小,把小的数往前移动
for (var j=0;j<numbers5.length -1- i;j++){
count++;
// 两两比较,从小到大排序
if (numbers5[j]>numbers5[j+1]){
// 交换位置
isSoret = false;
var tmp = numbers5[j];
numbers5[j] = numbers5[j+1];
numbers5[j+1] = tmp;
}
}
// 某一趟结束,判断一下排序是否结束
// 如何判断排序是否排好:根据是否发生数据两两交换,发生了说明没有排好
if (isSort){
break;
}
}
console.log(numbers5); // [29, 45, 51, 68, 72, 97]
console.log(count); // 20