7.1 数组的概念
案例计算10名同学的平均分
<script>
var a1,a2,a3,a4,a5,a6,a7,a8,a9,a10;
a1 = Number(prompt("请输入分数"));
a2 = Number(prompt("请输入分数"));
a3 = Number(prompt("请输入分数"));
a4 = Number(prompt("请输入分数"));
a5 = Number(prompt("请输入分数"));
a6 = Number(prompt("请输入分数"));
a7 = Number(prompt("请输入分数"));
a8 = Number(prompt("请输入分数"));
a9 = Number(prompt("请输入分数"));
a10 = Number(prompt("请输入分数"));
var ave = (a1+a2+a3+a4+a5+a6+a7+a8+a9+a10)/10;
alert(ave);
</script>
这样的代码量是和人数成正比的,数量多了还好,数量多了要写无数的代码。
但是尝试了一下发现,循环使用不上,因为无法去控制变量a1,a2,也就是无法将循环控制变量和变量a1、a2练习起来。
<script>
var a = [];
var sum = 0;
for (var i = 0; i < 10; i++) {
a[i] = Number(prompt("请输入分数"));
sum += a[i];
}
var ave = sum / a.length;
alert(ave);
</script>
这段代码能够实现同样的功能,而且如果是100人的话,只要把循环的条件改为i<100即可,整个程序的结构和代码量和人数多少没有关系。
我们把变量的表达方式改变了,即名称+序号的方式(a[0]、a[1]……),那么序号是可以用循环变量来控制。
7.2 数组的定义与元素访问
定义有三种方式
(1)var a = [];
(2)var a = new Array();
(3)var a = [0,0,0];
访问元素:数组名+下标
a[0] a[3]
需要注意的是下标是从0开始的,所以在使用的时候需要注意越界问题,比如5个元素的数组,那么他的下标范围为【1,4】,不包括5,5’5,5已经越界了。
数组的本质:一组变量的集合,或者说是一组内存单元。只不过对于变量的表示方式使用的是数组名+下标的方式。
7.3 数组的常用属性和方法
数组的属性(length):
(1).告诉我们数组的长度:数组名.length
(2).通过该属性可以改变数组的长度
<script>
var a = [];
var sum = 0;
for (var i = 0; i < a.length; i++) {
a[i] = Number(prompt("请输入分数"));
sum += a[i];
}
var ave = sum / a.length;
alert(ave);
</script>
数组的常用方法:
(1)unshift:在数组头部添加元素,返回值返回的是新添加的元素
shift:删除数组头部的元素,返回值是删除的头部元素
(2)indexOf:查找在数组中重复出现的元素第一次出现的位置,返回值是该元素的下标。
lastIndexOf:查找数组中重复出现的元素最后一次出现的位置,返回值是该元素的下标。
(3)push:在数组的尾部插入元素,返回值是添加元素后数组的长度。
Pop:从数组的尾部删除最后一个元素,返回值是删除的元素。
(4)slice(前面开始位置的下标,后面结束位置的下标):提取数组中指定连续的子数组。前包括,后不包括
(5)splice(开始删除位置的下标,要删除位置的长度,选择插入或者替换的内容(splice中文有“剪接”的意思,也就是有“加”有“减”),前面两个参数定义“剪”的部分,第三个参数定义借“接”的部分,经过不同参数组合就可以实现以下三大功能):
【1】删除操作(删除数组中指定的任意元素);
【2】插入操作(在数组中指定位置插入元素);
【3】替换操作(在数组中替换指定位置的元素)。
(6)reverse:将数组中的元素,反序输出。在原数组的基础上进行反序输出,不会重新创建新数组。
(7)map:原数组的映射,经过函数的加工,返回给一个新的数组。
一般我们传递的参数都是数值、字符串等类型的数据,有些时候可能需要传递一个函数,那么如何去传递一个函数呢?
函数名就是函数传递入口的地址。
<script>
var a = [2, 4, 6, 8];
var b = a.map(fun);
alert(b);
function fun(value, index, self) {
return value * value;
}
alert(b);
</script>
我们可以将以上内容简写为:
<script>
var a = [2, 4, 6, 8];
var b = a.map(function (value, index, self) {
return value * value;
});
alert(b);
</script>
这就是匿名函数。
7.5 数组的应用
(1)查找
Indexof系统提供
我们也可以实现自己的查找
a.顺序查找
<script>
var a = [3,7,11,43,87,5,99,22,51,8];
var num = Number(prompt("请输入要查找的值"));
var index = -1;//最初认为要找的数不在数组中
for (var i in a){
if(a[i]==num){
index = i;
break;
}
}
alert(index);
</script>
这种查找方法最简单,但是查找次数与数据量成正比,效率不高。
b.折半查找(二分查找)
<script>
/*
* 思路:
* (1)用left表示查找范围的起点,end表示终点
* (2)只要start<=end就重复一下步骤3
* (3)和中间位置(mid)的那个数进行比较
* a、相等:找到了,结束
* b、大于:在前半段找,即end=mid-1
* c、小于:在后半段找,即start=mid+1
* */
var a = [3, 5, 7, 8, 11, 22, 43, 51, 87, 99];
var num = Number(prompt("请输入要查找的值"));
var index = -1;//最初认为要找的数不在数组中
var start = 0;
var end = a.length - 1;
while (start <= end) {
var mid = Math.ceil((start + end) / 2);//计算中间位置(Math.ceil()取整)
if (num == a[mid]) {
index = mid;
break;
} else {
if (num > a[mid]) {
//在后半段找
start = mid + 1;
} else {
//在前半段
end = mid - 1;
}
}
}
alert(index);
</script>
假设在一个已经有序的数组中,可以利用折半查找大幅度提高效率。
折半查找的最坏查找次数与数量的关系是对数关系,所以说它的查找次数高,但是任何事都有两面性,他的高效率也要有高代价,也就是要求有序。
(2)排序(冒泡排序)
<script>
//冒泡排序
var a = [3, 7, 11, 43, 87, 5, 99, 22, 51, 8];
// var num = Number(prompt("请输入要查找的值"));
for (var i = 1; i < a.length - 1; i++) {
for (var j = 0; j <= a.length - i - 1; j++) {
//不满足升序就对调
if (a[j] > a[j + 1]) {
var t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
alert(a.toString());
</script>
(选择排序法)
(3)队列
先进先出(FIFO),在头部出队(shift),在尾部入队。
<script>
var a =[];
a.push(1);
document.write(a.toString()+"</br>");
a.push(2);
document.write(a.toString()+"</br>");
a.push(3);
document.write(a.toString()+"</br>");
a.shift();
document.write(a.toString()+"</br>");
a.shift();
document.write(a.toString()+"</br>");
a.shift();
</script>
(4)堆栈
先进后出(FILO),在尾部进栈(pop),在尾部出
<script>
var a =[];
a.push(1);
document.write(a.toString()+"</br>");
a.push(2);
document.write(a.toString()+"</br>");
a.push(3);
document.write(a.toString()+"</br>");
a.pop();
document.write(a.toString()+"</br>");
a.pop();
document.write(a.toString()+"</br>");
a.pop();
</script>