JS数组7

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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章