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