1. 程式人生 > >JavaScript複習筆記(三)陣列及陣列API

JavaScript複習筆記(三)陣列及陣列API

一、陣列

分為兩種  關聯陣列:可以自己定義下標名稱的陣列

          索引陣列:自動生成下標的陣列都是索引陣列

1、建立、賦值和取值

①建立:4種:

      1. var 變數名=[];   建立一個空陣列物件

      2. var 變數名=[值1,值2,...](常用)建立陣列同時,為陣列指定初始元素(陣列中每個值)

        陣列是引用型別的物件,變數中儲存了陣列物件的地址值

      3. var arr=new Array();  建立一個空陣列物件

         new:建立一個新物件,並返回新物件地址,Array:js中的陣列型別

         new Array()-->建立一個數組型別的新物件,並返回新物件的地址。

      4. var arr=new Array(n);-->建立n個元素的陣列,new Array(值1,值2,...)

② 賦值:陣列變數[i]=新值;

找到陣列:使用變數等效於直接使用變數引用的陣列物件

      陣列物件中,每個元素都有一個下標:每個元素的位置號,

下標從0開始,到元素個數-1結束

③ 取值: 陣列變數[i]

陣列變數[i]-->獲得i位置元素中的值

2、js陣列下標越界不會出錯!

      為不存在的位置賦值:不會出錯!會自動建立指定下標的新元素。

      從不存在的位置取值:不會出錯!也不會增加新元素,而是返回undefined

3、 .length屬性:陣列是物件,封裝了一組資料,並提供了對資料的操作方法

①常用方式  arr[arr.length-1]: 獲得任意長度陣列中的最後一個元素

            arr[arr.length]=新值: 向陣列末尾追加一個新元素

            改小length的值,可刪除末尾元素

②獲得陣列中的元素個數不一定等於實際的元素個數

例:var a=[];a[5]=5;console.log(a.length);console.log(a[2]);//輸出:6 undefined

實際只賦值一個元素,length卻為6,其餘未被賦值都為undefined

4、陣列遍歷:從下標0位置開始,依次取出每個元素,反覆執行相同的操作。

① 迴圈條件:下標i<arr.length②迴圈變數:下標i, 從0開始,每次增1,直到arr.length-1③ 迴圈體:xxx

例  var a=[1,1,2,3,5,8];

for(var i=0;i<a.length;i++){

console.log(a[i]);

}     //輸出1 1 2 3 5 8

5、關聯陣列:可以自己定義下標名稱的陣列

 ①建立關聯陣列: var arr=[];

               arr["key1"]=value1;

               arr["key2"]=value2;                      

例 var SLP=[];

SLP["yanzhi"]=100

SLP["caihua"]=100

SLP["English"]=0

 

②如何訪問關聯陣列中的元素:arr["key"]

關聯陣列: 下標是不能重複的

           優勢:精確定位某個下標的位置,不用遍歷

        索引陣列:下標自動分配,無意義(常見)

           缺點:要想按內容查詢元素,只能從頭開始遍歷!

③遍歷關聯陣列:依次遍歷arr中每個元素,將當前元素的下標存入key中

關聯陣列中的.length屬性失效!

        for(var key in arr){

      key;    //得到當前元素的下標

          arr[key]; //得到當前元素的值!

       }

例:var SLP=[];

SLP["yanzhi"]=100;

SLP["caihua"]=100;

SLP["English"]=0;

for(var key in SLP){

 console.log(key+":"+SLP[key]);

};

//結果: yanzhi:100   caihua:100   English:0

6、氣泡排序

var a=[7,16,8,6,15]

for(i=1;i<a.length;i++){         

for(j=0;j<a.length-i;j++){

if(a[j]>a[j+1]){

max=a[j];

a[j]=a[j+1];

a[j+1]=max;

}}}

console.log(a);// [6, 7, 8, 15, 16]

7、陣列API:

①無法直接修改原物件,而返回新物件API(常考)

toString()   join()   concat()    slice()

②陣列 to String:2種:

      var str=arr.toString();-->輸出陣列中的內容,每個元素用逗號分隔

      var str=arr.join("連線符")(常用)-->輸出陣列中的內容,自定義元素間連線符

        使用的2種固定套路

           1. 將字元組成單詞:arr.join("")        //效果:abcd

           2. 將單片語成句子:arr.join("  ")      //效果:a b c d

③拼接:var newArr=arr.concat(另一個數組,值1,值2...)

例:a=[1,2,3,4];b=[7,8,9];

var c=a.concat(10,b);

console.log(a);  //a不改變,說明不能直接修改原物件

console.log(c);

//輸出 [1, 2, 3, 4]   [1, 2, 3, 4, 10, 7, 8, 9]

④擷取:var subArr=arr.slice(starti[,endi+1]);含頭不含尾,starti和endi代表陣列下標

第二個引數可以省略,代表一直擷取到結尾,引數可以取負值,負值從右數,從-1數起

例:var arr=[0,1,2,3,4,5,6];

console.log(arr.slice(0,3));   //輸出 [0, 1, 2],含頭不含尾

console.log(arr.slice(-1,-3));  //輸出  []   ,方向寫反了,無法從後向前擷取

console.log(arr.slice(-3,-1));  //輸出 [4, 5] ,取負數最後一位下標為-1,也含頭不含尾

 

  ⑤ splice: 刪除 、插入、替換(陣列最強大的API)

      刪除:arr.splice(starti,刪除個數)

      插入:arr.splice(starti,0,新值1,...)

      替換:arr.splice(starti,刪除個數,新值1,...)

基本結構

   arr.splice (     3,                     2,                21,22,23,24);

          從第三位開始(含頭)     刪兩個         替換為21,22,23,24

例:arr=[11,12,13,14,15,16,17,18,19];

arr.splice (3,2,21,22,23,24);

console.log(arr);

//輸出 [11, 12, 13, 21, 22, 23, 24, 16, 17, 18, 19]

 

  ⑥ arr.reverse(); 顛倒陣列中所有元素

arr=[11,12,13,14,15,16,17,18,19];

console.log(arr.reverse());   // [19, 18, 17, 16, 15, 14, 13, 12, 11]

⑦arr.sort()按Unicode碼排序

例:var a=[1,12,4,46,3,35];

console.log(a.sort());    // [1, 12, 3, 35, 4, 46]

如何讓sort()方法按數值大小排序,定義一個比較器函式

function compare(a,b){return a-b}

例:  var a=[1,12,4,46,3,35];

function compare(a,b){return a-b}

console.log(a.sort(compare));  //[1, 3, 4, 12, 35, 46]

8、棧和佇列:js中沒有真正的棧和佇列的型別,一切都是用陣列物件模擬的

   一) 棧:只能從一端進出的陣列,另一端封閉 (FILO first in last out 先進後出)

      ① 末尾出入棧:已入棧元素的下標不再改變

         入棧: arr.push(新值1,...)

         出站: arr.pop()

var a=[1,12,4,46,3,35];  a.pop();  console.log(a);  // [1, 12, 4, 46, 3]

var a=[1,12,4,46,3,35];  a.push(11,22);  console.log(a);  // [1, 12, 4, 46, 3, 35, 11, 22]

      ② 開頭出入棧:每次入棧新元素時,已入棧元素的位置都會向後順移。

        入棧:arr.unshift(新值1,...);

        出站:arr.shift();

var a=[1,12,4,46,3,35];  a.unshift(11,22);  console.log(a);  // [11, 22, 1, 12, 4, 46, 3, 35]

var a=[1,12,4,46,3,35];  a.shift();  console.log(a);  // [12, 4, 46, 3, 35]    

二) 佇列:只允許從末尾進入陣列,必須從開頭出陣列(FIFO first in first out 先進先出)             結尾入佇列:arr.push();

              開頭出佇列:arr.shift();

9、二維陣列:陣列中的元素,又引用了另一個子陣列物件

  ① 使用二維陣列場景2種:

        要儲存橫行豎列的二維資料

        要儲存上下級關係的資料時

② 如何建立二維陣列2種:

       1. 先建立空陣列,再賦值:

          var arr=[];

          arr[0]=["石家莊","保定","唐山"];

      arr[1]=["德州","濟南","煙臺"];

       2. 建立陣列時,同時初始化子陣列:     

          var data=[

          [0,2,2,4],        //第0行

          [2,4,4,8],        //第1行

          [16,32,16,8],     //第2行

          [4,2,128,4]       //第3行

          ];

    如何訪問二維陣列中的資料:arr[行下標][列下標]

        比如:data中第2行,第3個元素,data[1][2]

    強調:二維陣列中,行下標不能越界!

          console.log(data[1][5]); //undefined

          console.log(data[5][1]); // Uncaught TypeError

③遍歷二維陣列:

固定套路:外層迴圈遍歷行,記憶體迴圈遍歷列

        var arr=[[...],[...]...]

    for(var r=0;r<arr.length;r++){

    for(var c=0;c<arr[r].length;c++){

      console.log(arr[r][c]);

            }

        }