索引陣列

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

索引陣列會儲存一系列一或多個值,這些值經過組織,可以使用無正負號的整數值加以存取。第一個索引一定是數字 0,而每個相繼新增到陣列之元素的索引則會加 1 來遞增。在 ActionScript 3.0 中,會使用 Array 類別和 Vector 類別當做索引陣列。

索引陣列會使用無正負號的 32 位元整數做為索引編號。索引陣列的大小上限為 2 32 - 1 或 4,294,967,295。嘗試建立大於此上限的陣列會導致發生執行階段錯誤。

若要存取索引陣列的個別元素,您可以使用陣列存取 ( [] ) 運算子,指定要存取之元素的索引位置。例如,下列程式碼表示陣列索引 (名為 songTitles ) 中的第一個陣列 (位於索引 0 的元素):

songTitles[0]

陣列變數名稱後面接著括住索引的方括號,這種組合的作用是當做單一識別名稱 (換句話說,變數名稱可以利用各種方式來使用這種組合)。您可以在指定陳述式左邊使用名稱和索引,將某個值指定給索引陣列元素:

songTitles[1] = "Symphony No. 5 in D minor";

同樣地,您也可以在指定陳述式右邊使用名稱和索引,擷取索引陣列元素的值。

var nextSong:String = songTitles[2];

此外,還可以在方括號中使用變數,而不需提供明確的值 (變數必須包含非負數整數值,例如 uint、正 int 或正整數 Number 實體)。需要「重複執行」索引陣列中的元素,或針對部分或所有元素執行某項作業時,往往都會用到這項技巧。下列程式碼將示範這項技巧的操作方式。在程式碼中,會使用迴圈存取 Array 物件 (名為 oddNumbers ) 內的每個值。然後,再使用 trace() 陳述式,依照「oddNumber[索引] = 值」格式輸出每個值:

var oddNumbers:Array = [1, 3, 5, 7, 9, 11]; 
var len:uint = oddNumbers.length; 
for (var i:uint = 0; i < len; i++) 
{ 
    trace("oddNumbers[" + i.toString() + "] = " + oddNumbers[i].toString()); 
}

Array 類別

索引陣列的第一個類型是 Array 類別。Array 實體可以存放任何資料類型的值。同一個 Array 物件可以存放不同資料類型的物件。例如,一個 Array 實體可以在索引 0 存放 String 值、在索引 1 存放 Number 實體,以及在索引 2 存放 XML 物件。

Vector 類別

您可以在 ActionScript 3.0 中使用的另一種索引陣列是 Vector 類別。Vector 實體是「類型陣列」,表示 Vector 實體中所有元素的資料類型都相同。

備註: 從 Flash Player 10 和 Adobe AIR 1.5 開始,Vector 類別已可供使用。

當您宣告 Vector 變數或實體化 Vector 物件時,必須明確指定 Vector 可包含的物件資料類型。所指定的資料類型稱為 Vector 的「基底類型」。在執行階段和編譯階段 (在嚴謹模式中),會檢查任何設定 Vector 元素的值或從 Vector 擷取值的程式碼。如果所加入或擷取之物件的資料類型與 Vector 的基底類型不符,便會發生錯誤。

除了資料類型限制之外,Vector 類別的其他限制與 Array 類別還是有所區別的:

  • Vector 是密集陣列。Array 物件可以在索引 0 和 7 具有值,即使索引 1 到 6 都沒有值也無妨。不過,Vector 的每個索引則都必須具有值 (或 null )。

  • 您可以選擇是否要固定 Vector 長度。這表示,您無法變更 Vector 包含的元素數目。

  • 存取 Vector 的元素時,會經過邊界檢查。您永遠都不能讀取大於最後一個元素 ( length - 1) 之索引的值。您永遠都不能設定超出目前最後一個索引之索引的值 (換句話說,只能設定位於現有索引或索引 [length] 的值)。

由於這些限制,比起元素都是單一類別實體的 Array 實體,Vector 有三大優點:

  • 效能:使用 Vector 實體的陣列元素存取和循環遠比使用 Array 實體時快得多。

  • 類型安全:在嚴謹模式中,編譯器可以識別資料類型錯誤。這類錯誤的範例包含指定具有不正確資料類型的值給 Vector,或者讀取來自 Vector 的值時,預期該值具有不正確的資料類型。在執行階段,當加入資料或讀取來自 Vector 物件的資料時,都會檢查資料類型。但是請注意,當您使用 push() unshift() 方法將值加入 Vector 時,在編譯階段並不會檢查引數的資料類型。使用這些方法時,在執行階段仍然會檢查所有的值。

  • 可靠性:與 Array 相比,執行階段範圍檢查 (或固定長度檢查) 會大幅增加可靠性。

除了額外的限制和優點之外,Vector 類別和 Array 類別可以說極為類似。Vector 物件的屬性和方法與 Array 的屬性和方法很類似 (在大部分情況下為完全相同)。在您想要使用所有元素都有相同資料類型之 Array 的大部分情況下,Vector 實體是比較好的方式。

建立陣列

您可以使用好幾種技巧來建立 Array 實體或 Vector 實體。不過,建立每一種陣列類型的技巧都有些許不同。

建立 Array 實體

您可以呼叫 Array() 建構函式或使用 Array 常值語法,建立 Array 物件。

Array() 建構函數有三種使用方式。第一,假設您呼叫不含引數的建構函式,會得到一個空陣列。您可以使用 Array 類別的 length 屬性來確認陣列中不包含元素。例如,下列程式碼會呼叫 Array() 建構函式,並且不搭配任何引數:

var names:Array = new Array(); 
trace(names.length); // output: 0

第二,假設您使用數字做為 Array() 建構函式的唯一參數,則會建立具有該長度的陣列,而且每個元素的值會設定為 undefined 。引數必須是介於 0 到 4,294,967,295 之間無正負號的整數。例如,下列程式碼會呼叫 Array() 建構函式,並搭配單一數值引數:

var names:Array = new Array(3); 
trace(names.length); // output: 3 
trace(names[0]); // output: undefined 
trace(names[1]); // output: undefined 
trace(names[2]); // output: undefined

第三,假設您呼叫建構函式並傳遞元素清單做為參數,則會以對應於每個參數的元素來建立陣列。下列程式碼會將三個引數傳遞給 Array() 建構函式:

var names:Array = new Array("John", "Jane", "David"); 
trace(names.length); // output: 3 
trace(names[0]); // output: John 
trace(names[1]); // output: Jane 
trace(names[2]); // output: David

您也可以使用 Array 常值來建立陣列。Array 常值可以直接指定給陣列變數,如下列範例所示:

var names:Array = ["John", "Jane", "David"];

建立 Vector 實體

您可以呼叫 Vector.<T>() 建構函式來建立 Vector 實體,也可以呼叫 Vector.<T>() 全域函數來建立 Vector。這個函數會將指定的物件轉換成 Vector 實體。在 Flash Professional CS5 (以及更新的版本)、Flash Builder 4 (以及更新的版本) 以及 Flex 4 (以及更新的版本) 中,您也可以使用 Vector 常值語法建立 Vector 實體。

每當宣告 Vector 變數 (或類似的 Vector 方法參數或方法傳回類型) 時,您都必須指定 Vector 變數的基底類型。當您藉由呼叫 Vector.<T>() 建構函式來建立 Vector 實體,也就是說,每當您在 ActionScript 中使用 Vector 一詞,就必須指定基底類型。

您可以使用類型參數語法,指定 Vector 的基底類型。在程式碼中,類型參數必須緊接在 Vector 這個字之後。這個語法的開頭為一個點 ( . ),後面再接著由角括號 ( <> ) 括住的基底類別名稱,如下列範例所示:

var v:Vector.<String>; 
v = new Vector.<String>();

在範例的第一行中,變數 v 被宣告為 Vector. <String> 實體。換句話說,這個變數就表示只能夠存放 String 實體的索引陣列。第二行會呼叫 Vector() 建構函式,建立具有相同 Vector 類型的實體 (也就是其元素都是 String 物件的 Vector),並且將這個物件指定給 v

使用 Vector.<T>() 建構函式

如果您使用 Vector.<T>() 建構函式時未搭配任何引數,那麼就會建立空的 Vector 實體。您可以檢查 Vector 的 length 屬性,測試是否為空實體。例如,下列程式碼會呼叫 Vector.<T>() 建構函式,並且不搭配任何引數:

var names:Vector.<String> = new Vector.<String>(); 
trace(names.length); // output: 0

如果您事先知道 Vector 一開始所需的元素數目,即可預先定義 Vector 中的元素數目。若要建立具有數個元素的 Vector,請傳遞元素的數目當做第一個參數 ( length 參數)。由於 Vector 的元素都不能是空白,因此這些元素會由基底類型的實體填滿。如果基底類型是允許 null 值的參考類型,則這些元素全部都會包含 null 。否則,這些元素全部都會包含該類別的預設值。例如,uint 變數就不能是 null 。因此,在下列程式碼中,會建立具有七個元素的 Vector (名為 ages ),其中每個元素都包含 0 這個值:

var ages:Vector.<uint> = new Vector.<uint>(7); 
trace(ages); // output: 0,0,0,0,0,0,0 

最後,使用 Vector.<T>() 建構函式,並傳遞 true 做為第二個參數 ( fixed 參數) 的值,即可建立長度固定的 Vector。在這種情況下,Vector 在建立時就已經具有指定的元素數目,而且您無法變更這個數目。但是請注意,您還是可以變更長度固定之 Vector 的元素值。

使用 Vector 常值語法建構函式

在 Flash Professional CS5 (以及更新的版本)、Flash Builder 4 (以及更新的版本) 以及 Flex 4 (以及更新的版本) 中,您可以傳送值清單給 Vector.<T>() 建構函式,以指定 Vector 一開始的值:

// var v:Vector.<T> = new <T>[E0, ..., En-1 ,]; 
// For example: 
var v:Vector.<int> = new <int>[0,1,2,];

以下資訊適用於此語法:

  • 可省略最後加上的逗點。

  • 不支援陣列中空白的項目;像 var v:Vector.<int> = new <int>[0,,2,] 的陳述式會發生編譯器錯誤。

  • 您無法指定 Vector 實體的預設長度。相反地,長度會與初始化清單中的元素數目相同。

  • 您無法指定 Vector 實體是否為固定長度。但可使用 fixed 屬性。

  • 如果以值的形式所傳遞之項目不符合指定的類型,則可能會發生資料遺失或錯誤。例如:
    var v:Vector.<int> = new <int>[4.2]; // compiler error when running in strict mode 
    trace(v[0]); //returns 4 when not running in strict mode

使用 Vector.<T>() 全域函數

除了 Vector.<T>() 和 Vector 常值語法建構函式,您也可以使用 Vector.<T>() 全域函數來建立 Vector 物件。 Vector.<T>() 全域函數是轉換函數。當您呼叫 Vector.<T>() 全域函數時,必須指定方法所傳回之 Vector 的基底類型。您可以傳遞單一索引陣列 (Array 或 Vector 實體) 做為引數,然後方法就會傳回具有指定之基底類型的 Vector,其中包含來源陣列引數中的值。下列程式碼會列出呼叫 Vector.<T>() 全域函數所需的語法:

var friends:Vector.<String> = Vector.<String>(["Bob", "Larry", "Sarah"]);

Vector.<T>() 全域函數會執行兩項資料類型轉換。首先,當 Array 實體傳遞至函數時,便會傳回 Vector 實體。接著,無論來源陣列是 Array 還是 Vector 實體,函數都會嘗試將來源陣列的元素轉換成基底類型的值。轉換時,會使用標準的 ActionScript 資料類型轉換規則。例如,下列程式碼會將來源 Array 中的 String 值轉換成所產生 Vector 中的整數。第一個值 ( "1.5" ) 的小數點部分會遭截斷,而且非數字的第三個值 ( "Waffles" ) 在結果中會轉換成 0:

var numbers:Vector.<int> = Vector.<int>(["1.5", "17", "Waffles"]); 
trace(numbers); // output: 1,17,0

如果來源中有任何元素無法轉換,便會發生錯誤。

當程式碼呼叫 Vector.<T>() 全域函數時,如果來源陣列中某一元素是所指定基底類型之子類別的實體,這個元素就會加入至產生的 Vector (不會發生錯誤)。使用 Vector.<T>() 全域函數是將基底類型為 T 的 Vector 轉換成基底類型為 T 之子類別的 Vector 的唯一方式。

插入陣列元素

若要在索引陣列中加入元素,最基本的方式就是使用陣列存取 ( [] ) 運算子。若要設定索引陣列元素的值,請在指定陳述式左邊使用 Array 或 Vector 物件名稱和索引:

songTitles[5] = "Happy Birthday";

如果 Array 或 Vector 本來就沒有該索引及在該處存放的元素,則會建立該索引並於該處儲存這個值。如果該索引已經有值,則新的值會取代現有的值。

Array 物件可讓您在任何索引建立元素。不過如果是 Vector 物件,您就只能將值指定給現有的索引,或者指定給下一個可用的索引。下一個可用的索引會對應至 Vector 物件的 length 屬性。若要在 Vector 物件中加入新元素,最安全的方式就是使用如下所示的程式碼:

myVector[myVector.length] = valueToAdd;

您可以利用 push() unshift() splice() 這三種 Array 和 Vector 類別方法,將元素插入索引陣列中。 push() 方法會將一或多個元素附加到陣列結尾。換句話說,以 push() 方法插入的最後一個元素具有最高的索引編號。 unshift() 方法會在陣列開頭 (索引編號一定是 0) 插入一或多個元素;而 splice() 方法則會在陣列的指定索引位置插入任意數量的項目。

下列範例將示範這三種方法。在範例中,會建立名為 planets 的陣列,依照距離「太陽」的遠近順序儲存行星名稱。首先,會呼叫 push() 方法加入第一個項目 Mars 。其次,呼叫 unshift() 方法,插入屬於陣列前方的項目 Mercury 。最後,則會呼叫 splice() 方法將 Venus Earth 項目插入 Mercury 之後、 Mars 之前。傳送給 splice() 的第一個引數 (整數 1) 會指示從索引 1 開始插入;傳送給 splice() 的第二個引數 (整數 0) 則會指示不要刪除任何項目;傳送給 splice() 的第三和第四個引數 Venus Earth 則是要插入的項目。

var planets:Array = new Array(); 
planets.push("Mars"); // array contents: Mars 
planets.unshift("Mercury"); // array contents: Mercury,Mars 
planets.splice(1, 0, "Venus", "Earth"); 
trace(planets); // array contents: Mercury,Venus,Earth,Mars

push() unshift() 方法都會傳回無正負號的整數,代表修改過的陣列長度。以 splice() 方法來插入元素時會傳回空陣列,乍看之下好像有點奇怪,但是從 splice() 方法的多功能性來看,就顯得相當合理。您不僅可以使用 splice() 方法將元素插入陣列,也能移除陣列中的元素。當您使用 splice() 方法移除元素時,會傳回包含所移除元素的陣列。

備註: 如果 Vector 物件的 fixed 屬性為 true ,Vector 中的元素總數就無法變更。如果您嘗試使用上述技巧在固定長度的 Vector 中加入新元素,就會發生錯誤。

擷取值以及移除陣列元素

若要從索引陣列擷取元素的值,最簡單的方式就是使用陣列存取 ( [] ) 運算子。若要擷取索引陣列元素的值,請在指定陳述式右邊使用 Array 或 Vector 物件名稱和索引:

var myFavoriteSong:String = songTitles[3];

如果某一索引沒有元素,您仍然可以嘗試使用該索引從 Array 或 Vector 擷取值。在這種情況下,Array 物件會傳回 undefined 值,而且 Vector 會擲回 RangeError 例外。

您可以利用 pop() shift() splice() 這三種 Array 和 Vector 類別方法來移除元素。 pop() 方法會從陣列結尾移除元素。換句話說,它會移除索引編號最高的元素。 shift() 方法會從陣列開頭移除元素,也就是說,它固定會移除索引編號為 0 的元素。可用來插入元素的 splice() 方法,則會從傳送至這個方法的第一個引數所指定的索引編號開始,移除任意數目的元數。

下列範例會使用這三種方法來移除 Array 實體中的元素。在範例中,會建立名為 oceans 的 Array 來儲存大型水域的名稱。Array 中有些名稱是湖泊的名稱,而非海洋的名稱,因此這些屬於湖泊的名稱必須加以移除。

首先,會使用 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"); // replaces Aral and Superior 
oceans.pop(); // removes Huron 
oceans.shift(); // removes Victoria 
trace(oceans);// output: Pacific,Arctic,Atlantic,Indian

pop() shift() 方法都會傳回所移除的項目。對 Array 實體而言,傳回值的資料類型是 Object,因為陣列可以保留任何資料類型的值。對於 Vector 實體而言,傳回值的資料類型則是 Vector 的基底類型。 splice() 方法會傳回包含所移除之值的 Array 或 Vector。您可以變更 oceans Array 範例,這樣對 splice() 的呼叫就會將傳回的 Array 指定給新的 Array 變數,如下列範例所示:

var lakes:Array = oceans.splice(2, 2, "Arctic", "Atlantic"); 
trace(lakes); // output: Aral,Superior

您可能會遇到針對 Array 物件元素使用 delete 運算子的程式碼。 delete 運算子會將 Array 元素的值設定為 undefined ,但是不會將元素從 Array 中移除。例如,下列程式碼會將 delete 運算子用於 oceans Array 的第三個元素,但是 Array 的長度仍然是 5:

var oceans:Array = ["Arctic", "Pacific", "Victoria", "Indian", "Atlantic"]; 
delete oceans[2]; 
trace(oceans);// output: Arctic,Pacific,,Indian,Atlantic 
trace(oceans[2]); // output: undefined 
trace(oceans.length); // output: 5

您可以使用陣列的 length 屬性截斷 Array 或 Vector。如果您為索引陣列之 length 屬性設定的長度比這個陣列的目前長度還小,這個陣列便會遭截斷,而且大於新的 length 值減 1 之索引編號的元素會遭移除。例如,如果 oceans 陣列在經過排序之後,所有有效的項目都位於陣列的開頭,您即可使用 length 屬性移除位於陣列結尾的項目,如下列程式碼所示:

var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"]; 
oceans.length = 2; 
trace(oceans); // output: Arctic,Pacific
備註: 如果 Vector 物件的 fixed 屬性為 true ,Vector 中的元素總數就無法變更。如果您嘗試使用上述技巧在固定長度的 Vector 中移除元素或截斷陣列,就會發生錯誤。

排序陣列

您可以使用 reverse() sort() sortOn() 這三種方法,藉由排序或反向順序排序來變更索引陣列的順序。這三種方法都會修改現有的陣列。下表摘要列出這些方法,以及這些方法針對 Array 和 Vector 物件的行為:

方法

針對 Array 的行為

針對 Vector 的行為

reverse()

變更元素的順序,使最後一個元素變成第一個元素,倒數第二個元素變成第二個元素,依此類推

與針對 Array 的行為相同

sort()

可讓您依照各種預先定義的方式 (例如,按照字母或數字順序),為 Array 的元素排序。您也可以指定自訂排序演算法

根據指定的自訂排序演算法,為元素排序

sortOn()

可讓您為具有一個或多個常用屬性的物件排序,以指定一個或多個屬性當做排序索引鍵使用

在 Vector 類別中無法使用

reverse() 方法

reverse() 方法既不使用參數也不傳回值,但是可以讓您將陣列順序從目前的狀態切換為反向順序。下列範例會反轉 oceans 陣列所列的海洋順序:

var oceans:Array = ["Arctic", "Atlantic", "Indian", "Pacific"]; 
oceans.reverse(); 
trace(oceans); // output: Pacific,Indian,Atlantic,Arctic

使用 sort() 方法進行基本排序 (僅適用於 Array 類別)

針對 Array 實體, sort() 方法會使用「預設的排序順序」重新排列陣列中的元素。預設的排序順序具有下列特性:

  • 排序動作有區分大小寫,也就是說,大寫字元會排在小寫字元前面。例如,字母 D 會排在字母 b 之前。

  • 排序動作採取升冪方式,也就是說,較低的字元碼 (例如 A) 會排在較高字元碼的前面 (例如 B)。

  • 排序動作會將相同的值排在相鄰位置,但沒有一定的順序。

  • 排序是以字串為基礎,這表示元素在進行比較前,會先轉換成字串 (例如,10 會排在 3 之前,因為字串 "1" 的字元碼較字串 "3" 低)。

您可能需要忽略大小寫限制為 Array 排序,或以遞減順序排序,或者,您可能要以陣列所包含的數字 (而非按英文字母順序) 來排序。只要利用 Array 類別之 sort() 方法的 options 參數,您就可以變更預設排序順序的每個特徵。這些選項是由 Array 類別中的一組靜態常數所定義,如下列清單所示:

  • Array.CASEINSENSITIVE :這個選項會忽略大小寫限制加以排序。例如,小寫字母 b 會排在大寫字母 D 之前。

  • Array.DESCENDING :這會反轉預設的依遞增順序排序。例如,字母 B 會排在字母 A 之前。

  • Array.UNIQUESORT :這會在發現兩個相同的值時,中止排序作業。

  • Array.NUMERIC :這會進行數值排序,因此 3 會排在 10 之前。

下列範例會加強說明上述幾個選項。在範例中,會建立名為 poets 的 Array,並以幾個不同的選項加以排序。

var poets:Array = ["Blake", "cummings", "Angelou", "Dante"]; 
poets.sort(); // default sort 
trace(poets); // output: Angelou,Blake,Dante,cummings 
 
poets.sort(Array.CASEINSENSITIVE); 
trace(poets); // output: Angelou,Blake,cummings,Dante 
 
poets.sort(Array.DESCENDING); 
trace(poets); // output: cummings,Dante,Blake,Angelou 
 
poets.sort(Array.DESCENDING | Array.CASEINSENSITIVE); // use two options 
trace(poets); // output: Dante,cummings,Blake,Angelou

使用 sort() 方法進行自訂排序 (適用於 Array 和 Vector 類別)

除了適用於 Array 物件的基本排序方式以外,您還可以定義自訂排序規則。這項技巧是唯一一個能夠透過 sort() 方法使用 Vector 類別的方式。若要定義自訂排序,請撰寫自訂排序函數,並將它傳遞至 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); // output: John Q. Smith,Jane Doe,Mike Jones 
names.sort(orderLastName); 
trace(names); // output: Jane Doe,Mike Jones,John Q. Smith

自訂排序函數 orderLastName() 會使用規則運算式擷取每個元素的姓氏,以用於比較運算作業。針對 names 陣列呼叫 sort() 方法時,是以函數的識別名稱 orderLastName 做為唯一參數。排序函數會採用 a b 參數,因為它能同時作用於兩種陣列元素。排序函數的傳回值會指出元素是以何種方式排序:

  • 傳回值 -1 表示第一個參數 a 是在第二個參數 b 之前。

  • 傳回值 1 表示第二個參數 b 是在第一個參數 a 之前。

  • 傳回值 0 指出元素都具有相同的排序優先順序。

sortOn() 方法 (僅適用於 Array 類別)

sortOn() 方法是針對具有內含物件之元素的 Array 物件所設計。這些物件預期會有至少一個共同屬性,以做為排序索引鍵。將 sortOn() 方法用於其它類型的陣列時,會產生無法預期的結果。

備註: Vector 類別並不包括 sortOn() 方法。這個方法只適用於 Array 物件。

下列範例會修改 poets Array,因此每個元素都會是物件而非字串。每個物件都保留了詩人的姓氏和出生年份。

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 屬性為 Array 排序。 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); 
} 
/* output: 
Wang 701 
Dante 1265 
Blake 1757 
cummings 1894 
Angelou 1928 
*/

在不修改原始陣列的情況下進行排序 (僅適用於 Array 類別)

一般來說, sort() sortOn() 方法都會修改 Array。若您希望排序 Array 但不修改現有陣列,請傳遞 Array.RETURNINDEXEDARRAY 常數做為 options 參數的一部分。這個選項會指示方法傳回能夠反應排序的新 Array,並將原始 Array 保留不變。方法所傳回的 Array 是可以反映新排序順序的索引編號簡單 Array,其中不包含原始 Array 的任何元素。例如,若要依出生年份排序 poets Array 而不修改 Array,請將 Array.RETURNINDEXEDARRAY 常數納入要傳遞做為 options 參數之引數的一部分。

下列範例會將傳回的索引資訊儲存在名為 indices 的 Array 中,並使用 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); 
} 
/* output: 
Wang 701 
Dante 1265 
Blake 1757 
cummings 1894 
Angelou 1928 
*/

查詢陣列

concat() join() slice() toString() 四種 Array 和 Vector 類別的方法都會向陣列查詢資訊,但是不會修改陣列。 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); // output: alpha,beta,gamma,delta 
 
var array3:Array = array1.concat(array2); 
trace(array3); // output: alpha,beta,alpha,beta,gamma,delta 
 
var array4:Array = array3.slice(2,5); 
trace(array4); // output: alpha,beta,gamma

您可以使用 join() toString() 方法來查詢陣列,並傳回陣列內容做為字串。如果沒有對 join() 方法使用任何參數,這兩種方法的行為方式是相同的,亦即它們都會傳回字串,其中包含陣列內以逗點分隔的所有元素清單。 join() 方法與 toString() 方法不同,前者會採用名為 delimiter 的參數,可以讓您選擇符號,以做為傳回字串中每個元素之間的分隔符號。

下列範例會建立名為 rivers 的 Array,並同時呼叫 join() toString() 以字串型式傳回 Array 中的值。使用 toString() 方法可傳回以逗點分隔的值 ( riverCSV ),而使用 join() 方法則可傳回以 + 字元分隔的值。

var rivers:Array = ["Nile", "Amazon", "Yangtze", "Mississippi"]; 
var riverCSV:String = rivers.toString(); 
trace(riverCSV); // output: Nile,Amazon,Yangtze,Mississippi 
var riverPSV:String = rivers.join("+"); 
trace(riverPSV); // output: Nile+Amazon+Yangtze+Mississippi

有關 join() 方法要注意的一點是,不管您為主要陣列元素指定了何種分隔符號,所有巢狀 Array 或 Vector 實體一律都會傳回以逗點分隔的值,如下列範例所示:

var nested:Array = ["b","c","d"]; 
var letters:Array = ["a",nested,"e"];  
var joined:String = letters.join("+"); 
trace(joined); // output: a+b,c,d+e