簡介
第一個索引始終是數字 0,且添加到數組中的每個後續元素的索引以 1 為增量遞增。正如以下代碼所示,可以調用 Array 類構造函式或使用數組文本初始化數組來創建索引數組:
// 使用 Array 構造函式。var myArray:Array = new Array();myArray.push("one");myArray.push("two");myArray.push("three");trace(myArray); // 輸出:one,two,three// 使用數組文本。var myArray:Array = ["one", "two", "three"];trace(myArray); // 輸出:one,two,three
Array 類中還包含可用來修改索引數組的屬性和方法。這些屬性和方法幾乎是專用於索引數組而非關聯數組的。
索引數組使用無符號 32 位整數作為索引號。索引數組的最大大小為 2-1,即 4,294,967,295。如果要創建的數組大小超過最大值,則會出現運行時錯誤。
數組元素的值可以為任意數據類型。ActionScript 3.0 不支持"指定類型的數組"概念,也就是說,不能指定數組的所有元素都屬於特定數據類型。
本部分說明如何使用 Array 類創建和修改索引數組,首先講的是如何創建數組。修改數組的方法分為三類,包括如何插入元素、刪除元素和對數組進行排序。最後一類中的方法將現有數組當作唯讀數組,這些方法僅用於查詢數組。所有查詢方法都返回新的數組,而非修改現有數組。本部分結尾討論了如何擴展 Array 類。
創建數組
Array 構造函式的使用有三種方式。
第一種,如果調用不帶參數的構造函式,會得到空數組。可以使用 Array 類的 length 屬性來驗證數組是否不包含元素。例如,以下代碼調用不帶參數的 Array 構造函式:
var names:Array = new Array();trace(names.length); // 輸出:0
第二種,如果將一個數字用作 Array 構造函式的唯一參數,則會創建長度等於此數值的數組,並且每個元素的值都設定為 undefined。參數必須為介於值 0 和 4,294,967,295 之間的無符號整數。例如,以下代碼調用帶有一個數字參數的 Array 構造函式:
var names:Array = new Array(3);trace(names.length); // 輸出:3trace(names[0]); // 輸出:undefinedtrace(names[1]); // 輸出:undefinedtrace(names[2]); // 輸出:undefined
第三種,如果調用構造函式並傳遞一個元素列表作為參數,將創建具有與每個參數對應的元素的數組。以下代碼將三個參數傳遞給 Array 構造函式:
var names:Array = new Array("John", "Jane", "David");trace(names.length); // 輸出:3trace(names[0]); // 輸出:Johntrace(names[1]); // 輸出:Janetrace(names[2]); // 輸出:David
也可以創建具有數組文本或對象文本的數組。可以將數組文本直接分配給數組變數,如以下示例所示:
var names:Array = ["John", "Jane", "David"];
查詢數組
Array 類中的其餘四種方法 concat()、join()、slice() 和 toString() 用於查詢數組中的信息,而不修改數組。concat() 和 slice() 方法返回新數組;而 join() 和 toString() 方法返回字元串。concat() 方法將新數組和元素列表作為參數,並將其與現有數組結合起來創建新數組。slice() 方法具有兩個名為 startIndex 和 endIndex 的參數,並返回一個新數組,它包含從現有數組分離出來的元素副本。分離從 startIndex 處的元素開始,到 endIndex 處的前一個元素結束。值得強調的是,endIndex 處的元素不包括在返回值中。
以下示例通過 concat() 和 slice() 方法,使用其它數組的元素創建一個新數組:
var array1:Array = ["alpha", "beta"];var array2:Array = array1.concat("gamma", "delta");trace(array2); // 輸出:alpha,beta,gamma,deltavar array3:Array = array1.concat(array2);trace(array3); // 輸出:alpha,beta,alpha,beta,gamma,deltavar array4:Array = array3.slice(2,5);trace(array4); // 輸出:alpha,beta,gamma
可以使用 join() 和 toString() 方法查詢數組,並將其內容作為字元串返回。如果 join() 方法沒有使用參數,則這兩個方法的行為相同,它們都返回包含數組中所有元素的列表(以逗號分隔)的字元串。與 toString() 方法不同,join() 方法接受名為 delimiter 的參數;可以使用此參數,選擇要用作返回字元串中各個元素之間分隔設定的符號。
以下示例創建名為 rivers 的數組,並調用 join() 和 toString() 以便按字元串形式返回數組中的值。toString() 方法用於返回以逗號分隔的值 (riverCSV);而 join() 方法用於返回以 + 字元分隔的值。
var rivers:Array = ["Nile", "Amazon", "Yangtze", "Mississippi"];var riverCSV:String = rivers.toString();trace(riverCSV); // 輸出:Nile,Amazon,Yangtze,Mississippivar riverPSV:String = rivers.join("+");trace(riverPSV); // 輸出:Nile+Amazon+Yangtze+Mississippi
對於 join() 方法,應注意的一個問題是,無論為主數組元素指定的分隔設定是什麼,為嵌套數組返回的值始終以逗號作為分隔設定,如以下示例所示:
var nested:Array = ["b","c","d"]; var letters:Array = ["a",nested,"e"]; var joined:String = letters.join("+");trace(joined); // 輸出:a+b,c,d+e
對數組排序
可以使用三種方法(reverse()、sort() 和 sortOn())通過排序或反向排序來更改數組的順序。所有這些方法都用來修改現有數組。reverse() 方法用於按照以下方式更改數組的順序:最後一個元素變為第一個元素,倒數第二個元素變為第二個元素,依此類推。sort() 方法可用來按照多種預定義的方式對數組進行排序,甚至可用來創建自定義排序算法。sortOn() 方法可用來對對象的索引數組進行排序,這些對象具有一個或多個可用作排序鍵的公共屬性。
reverse() 方法不帶參數,也不返回值,但可以將數組從當前順序切換為相反順序。以下示例顛倒了 oceans 數組中列出的海洋順序:
var oceans:Array = ["Arctic", "Atlantic", "Indian", "Pacific"];oceans.reverse();trace(oceans); // 輸出:Pacific,Indian,Atlantic,Arctic
sort() 方法按照"默認排序順序"重新安排數組中的元素。默認排序順序具有以下特徵:
排序區分大小寫,也就是說大寫字元優先於小寫字元。例如,字母 D 優先於字母 b。 排序按照升序進行,也就是說低位字元代碼(例如 A)優先於高位字元代碼(例如 B)。 排序將相同的值互鄰放置,並且不區分順序。 排序基於字元串,也就是說,在比較元素之前,先將其轉換為字元串(例如,10 優先於 3,因為相對於字元串 "3" 而言,字元串 "1" 具有低位字元代碼)。 您也許需要不區分大小寫或者按照降序對數組進行排序,或者您的數組中包含數字,從而需要按照數字順序而非字母順序進行排序。sort() 方法具有 options 參數,可通過該參數改變默認排序順序的各個特徵。options 是由 Array 類中的一組靜態常量定義的,如以下列表所示:
Array.CASEINSENSITIVE:此選項可使排序不區分大小寫。例如,小寫字母 b 優先於大寫字母 D。 Array.DESCENDING:用於顛倒默認的升序排序。例如,字母 B 優先於字母 A。 Array.UNIQUESORT:如果發現兩個相同的值,此選項將導致排序中止。 Array.NUMERIC:這會導致排序按照數字順序進行,比方說 3 優先於 10。 以下示例重點說明了這些選項中的某些選項。它創建一個名為 poets 的數組,並使用幾種不同的選項對其進行排序。
var poets:Array = ["Blake", "cummings", "Angelou", "Dante"];poets.sort(); // 默認排序trace(poets); // 輸出:Angelou,Blake,Dante,cummingspoets.sort(Array.CASEINSENSITIVE);trace(poets); // 輸出:Angelou,Blake,cummings,Dantepoets.sort(Array.DESCENDING);trace(poets); // 輸出:cummings,Dante,Blake,Angeloupoets.sort(Array.DESCENDING | Array.CASEINSENSITIVE); // 使用兩個選項trace(poets); // 輸出:Dante,cummings,Blake,Angelou
您也可以編寫自定義排序函式,然後將其作為參數傳遞給 sort() 方法。例如,如果有一個名稱列表,其中每個列表元素都包含一個人的全名,但現在要按照姓來對列表排序,則必須使用自定義排序函式解析每個元素,然後使用排序函式中的姓。以下代碼說明如何使用作為參數傳遞給 Array.sort() 方法的自定義函式來完成上述工作:
var names:Array = new Array("John Q. Smith", "Jane Doe", "Mike Jones");function orderLastName(a, b):int{ var lastName:RegExp = /\b\S+$/; var name1 = a.match(lastName); var name2 = b.match(lastName); if (name1 < name2) { return -1; } else if (name1 > name2) { return 1; } else { return 0; }}trace(names); // 輸出:John Q. Smith,Jane Doe,Mike Jonesnames.sort(orderLastName);trace(names); // 輸出:Jane Doe,Mike Jones,John Q. Smith
自定義排序函式 orderLastName() 使用正則表達式從每個元素中提取姓,以用於比較操作。針對 names 數組調用 sort() 方法時,函式標識符 orderLastName 用作唯一的參數。排序函式接受兩個參數 a 和 b,因為它每次對兩個數組元素進行操作。排序函式的返回值指示應如何對元素排序:
返回值 -1 表示第一個參數 a 優先於第二個參數 b。 返回值 1 表示第二個參數 b 優先於第一個參數 a。 返回值為 0 表示元素具有相同的排序優先權。 sortOn() 方法是為具有包含對象的元素的索引數組設計的。這些對象應至少具有一個可用作排序鍵的公共屬性。如果將 sortOn() 方法用於任何其它類型的數組,則會產生意外結果。
以下示例修改 poets 數組,以使每個元素均為對象而非字元串。每個對象既包含詩人的姓又包含詩人的出生年份。
var poets:Array = new Array();poets.push({name:"Angelou", born:"1928"});poets.push({name:"Blake", born:"1757"});poets.push({name:"cummings", born:"1894"});poets.push({name:"Dante", born:"1265"});poets.push({name:"Wang", born:"701"});
可以使用 sortOn() 方法,按照 born 屬性對數組進行排序。sortOn() 方法定義兩個參數 fieldName 和 options。必須將 fieldName 參數指定為字元串。在以下示例中,使用兩個參數 "born" 和 Array.NUMERIC 來調用 sortOn()。Array.NUMERIC 參數用於確保按照數字順序進行排序,而不是按照字母順序。即使所有數字具有相同的數位,這也是一種很好的做法,因為當後來在數組中添加較少數位或較多數位的數字時,它會確保排序如期繼續進行。
poets.sortOn("born", Array.NUMERIC);for (var i:int = 0; i < poets.length; ++i){ trace(poets[i].name, poets[i].born);}/* 輸出:Wang 701Dante 1265Blake 1757cummings 1894Angelou 1928*/
通常,sort() 和 sortOn() 方法用來修改數組。如果要對數組排序而又不修改現有數組,請將 Array.RETURNINDEXEDARRAY 常量作為 options 參數的一部分進行傳遞。此選項將指示方法返回反映排序的新數組同時保留原始數組原封不動。方法返回的數組為由反映新排序順序的索引號組成的簡單數組,不包含原始數組的任何元素。例如,如果要根據出生年份對 poets 數組排序,同時不對數組進行修改,請在傳遞的 options 參數中包括 Array.RETURNINDEXEDARRAY 常量。
以下示例將返回的索引信息存儲在名為 indices 的數組中,然後使用 indices 數組和未修改的 poets 數組按出生年份輸出詩人:
var indices:Array;indices = poets.sortOn("born", Array.NUMERIC | Array.RETURNINDEXEDARRAY);for (var i:int = 0; i < indices.length; ++i){ var index:int = indices[i]; trace(poets[index].name, poets[index].born);}/* 輸出:Wang 701Dante 1265Blake 1757cummings 1894Angelou 1928*/
刪除數組元素
可以使用 Array 類的三種方法(pop()、shift() 和 splice())從數組中刪除元素。pop() 方法用於從數組末尾刪除一個元素。換言之,它將刪除位於最大索引號處的元素。shift() 方法用於從數組開頭刪除一個元素,也就是說,它始終刪除索引號 0 處的元素。splice() 方法既可用來插入元素,也可以刪除任意數目的元素,其操作的起始位置位於由傳送到此方法的第一個參數指定的索引號處。
以下示例使用所有三種方法從數組中刪除元素。它創建一個名為 oceans 的數組,以便存儲較大水域的名稱。數組中的某些名稱為湖泊的名稱而非海洋的名稱,因此需要將其刪除。
首先,使用 splice() 方法刪除項 Aral 和 Superior,並插入項 Atlantic 和 Indian。傳遞給 splice() 的第一個參數是整數 2,它表示應從列表中的第三個項(即索引 2 處)開始執行操作。第二個參數 2 表示應刪除兩個項。其餘兩個參數 Atlantic 和 Indian 是要在索引 2 處插入的值。
然後,使用 pop() 方法刪除數組中的最後一個元素 Huron。最後,使用 shift() 方法刪除數組中的第一個項 Victoria。
var oceans:Array = ["Victoria", "Pacific", "Aral", "Superior", "Indian", "Huron"];oceans.splice(2, 2, "Arctic", "Atlantic"); // 替換 Aral 和 Superioroceans.pop(); // 刪除 Huronoceans.shift(); // 刪除 Victoriatrace(oceans); // 輸出:Pacific,Arctic,Atlantic,Indian
pop() 和 shift() 方法均返回已刪除的項。由於數組可以包含任意數據類型的值,因而返回值的數據類型為 Object。splice() 方法將返回包含被刪除值的數組。可以更改 oceans 數組示例,以使 splice() 調用將此數組分配給新的數組變數,如以下示例所示:
var lakes:Array = oceans.splice(2, 2, "Arctic", "Atlantic");trace(lakes); // 輸出:Aral,Superior
您可能會遇到這樣的代碼,它在數組元素上使用 delete 運算符。delete 運算符用於將數組元素的值設定為 undefined,但它不會從數組中刪除元素。例如,下面的代碼在 oceans 數組的第三個元素上使用 delete 運算符,但此數組的長度仍然為 5:
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Indian", "Atlantic"];delete oceans[2];trace(oceans); // 輸出:Arctic,Pacific,,Indian,Atlantictrace(oceans[2]); // 輸出:undefinedtrace(oceans.length); // 輸出:5
可以使用數組的 length 屬性截斷數組。如果將數組的 length 屬性設定為小於數組當前長度的值,則會截斷數組,在索引號高於 length 的新值減 1 處所存儲的任何元素將被刪除。例如,如果 oceans 數組的排序是將所有有效項放在數組的開始處,則可以使用 length 屬性刪除數組末尾的項,如以下代碼所示:
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"];oceans.length = 2;trace(oceans); // 輸出:Arctic,Pacific
插入數組元素
可以使用 Array 類的三種方法(push()、unshift() 和 splice())將元素插入數組。push() 方法用於在數組末尾添加一個或多個元素。換言之,使用 push() 方法在數組中插入的最後一個元素將具有最大索引號。unshift() 方法用於在數組開頭插入一個或多個元素,並且始終在索引號 0 處插入。splice() 方法用於在數組中的指定索引處插入任意數目的項目。
下面的示例對所有三種方法進行了說明。它創建一個名為 planets 的數組,以便按照距離太陽的遠近順序存儲各個行星的名稱。首先,調用 push() 方法以添加初始項 Mars。接著,調用 unshift() 方法在數組開頭插入項 Mercury。最後,調用 splice() 方法在 Mercury 之後和 Mars 之前插入項 Venus 和 Earth。傳遞給 splice() 的第一個參數是整數 1,它用於指示從索引 1 處開始插入。傳遞給 splice() 的第二個參數是整數 0,它表示不應刪除任何項。傳遞給 splice() 的第三和第四個參數 Venus 和 Earth 為要插入的項。
var planets:Array = new Array();planets.push("Mars"); // 數組內容:Marsplanets.unshift("Mercury"); // 數組內容:Mercury,Marsplanets.splice(1, 0, "Venus", "Earth");trace(planets); // 數組內容:Mercury,Venus,Earth,Mars
push() 和 unshift() 方法均返回一個無符號整數,它們表示修改後的數組長度。在用於插入元素時,splice() 方法返回空數組,這看上去也許有點奇怪,但考慮到 splice() 方法的多用途性,您便會覺得它更有意義。通過使用 splice() 方法,不僅可以將元素插入到數組中,而且還可以從數組中刪除元素。用於刪除元素時,splice() 方法將返回包含被刪除元素的數組。