Assoziative Arrays

Flash Player 9 und höher, Adobe AIR 1.0 und höher

Ein assoziatives Array wird manchmal auch als Hash oder Zuordnung bezeichnet und organisiert gespeicherte Werte mithilfe von Schlüsseln anstatt mit einem numerischen Index. Jeder Schlüssel in einem assoziativen Array ist ein eindeutiger String, über den auf einen gespeicherten Wert zugegriffen wird. Ein assoziatives Array ist eine Instanz der Object-Klasse, d. h. jeder Schlüssel entspricht einem Eigenschaftsnamen. Assoziative Arrays sind ungeordnete Sammlungen aus Schlüssel- und Wert-Paaren. Im Code kann nicht vorausgesetzt werden, dass die Schlüssel eines assoziativen Arrays in einer bestimmten Reihenfolge aufgeführt sind.

ActionScript 3.0 bietet auch einen erweiterten Typ assoziativer Arrays mit der Bezeichnung dictionary (Wörterbuch). Wörterbucher sind Instanzen der Dictionary-Klasse im Paket „flash.utils“. Sie verwenden Schlüssel, die einen beliebigen Datentyp aufweisen können. Mit anderen Worten: Schlüssel für Wörterbücher sind nicht auf Werte mit dem String-Datentyp beschränkt.

Assoziative Arrays mit Stringschlüsseln

Assoziative Arrays können in ActionScript 3.0 mit zwei verschiedenen Techniken erstellt werden. Bei der ersten Technik wird eine Object-Instanz verwendet. Bei Verwendung einer Object-Instanz können Sie Ihr Array mit einem Objektliteral initialisieren. Eine Instanz der Object-Klasse, auch als generisches Objekt bezeichnet, ist funktional mit einem assoziativen Array identisch. Jeder Eigenschaftsname des generischen Objekts dient als Schlüssel, der den Zugriff auf einen gespeicherten Wert ermöglicht.

Im folgenden Beispiel wird das assoziative Array monitorInfo erstellt und mithilfe eines Objektliterals mit zwei Schlüssel-Wert-Paaren initialisiert:

var monitorInfo:Object = {type:"Flat Panel", resolution:"1600 x 1200"}; 
trace(monitorInfo["type"], monitorInfo["resolution"]);  
// output: Flat Panel 1600 x 1200

Wenn das Array nicht bei der Deklaration initialisiert werden muss, können Sie das Array wie folgt mit dem Object-Konstruktor erstellen:

var monitorInfo:Object = new Object();

Nachdem Sie das Array mit einem Objektliteral oder dem Konstruktor der Object-Klasse erstellt haben, können Sie ihm neue Werte hinzufügen, indem Sie entweder den Array-Zugriffsoperator ( [] ) oder den Punktoperator ( . ) verwenden. Im folgenden Beispiel werden monitorArray zwei neue Werte hinzugefügt:

monitorInfo["aspect ratio"] = "16:10"; // bad form, do not use spaces 
monitorInfo.colors = "16.7 million"; 
trace(monitorInfo["aspect ratio"], monitorInfo.colors); 
// output: 16:10 16.7 million

Beachten Sie, dass der Schlüssel aspect ratio ein Leerzeichen enthält. Dies ist bei Verwendung des Array-Zugriffsoperators ( [] ) möglich, führt jedoch bei Verwendung des Punktoperators zu einer Fehlermeldung. Es wird davon abgeraten, Leerzeichen in Schlüsselnamen zu verwenden.

Beim zweiten Verfahren zur Erstellung eines assoziativen Arrays wird der Array-Konstruktor (bzw. der Konstruktor einer beliebigen dynamischen Klasse) verwendet. Mit dem Array-Zugriffsoperator ( [] ) oder dem Punktoperator ( . ) werden anschließend Schlüssel-Wert-Paare zum Array hinzugefügt. Wenn Sie das assoziative Array als Array-Typ deklarieren, kann das Array nicht mit einem Objektliteral initialisiert werden. Im folgenden Beispiel werden mit dem Array-Konstruktor das assoziative Array monitorInfo erstellt sowie der Schlüssel type und der Schlüssel resolution mit den zugehörigen Werten hinzugefügt:

var monitorInfo:Array = new Array(); 
monitorInfo["type"] = "Flat Panel"; 
monitorInfo["resolution"] = "1600 x 1200"; 
trace(monitorInfo["type"], monitorInfo["resolution"]);  
// output: Flat Panel 1600 x 1200

Die Verwendung des Array-Konstruktors zur Erstellung eines assoziativen Arrays bietet keine Vorteile. Bei assoziativen Arrays können Sie nicht die Array.length -Eigenschaft und keine Methoden der Array-Klasse verwenden, auch wenn Sie den Array-Konstruktor oder den Array-Datentyp verwenden. Die Verwendung des Array-Konstruktors eignet sich am besten zur Erstellung indizierter Arrays.

Assoziative Arrays mit Objektschlüsseln (Wörterbücher)

Mithilfe der Dictionary-Klasse können Sie assoziative Arrays erstellen, bei denen Objekte und keine Strings als Schlüssel verwendet werden. Diese Arrays werden auch als Wörterbücher, Hashes oder Zuordnungen bezeichnet. Bei einer Anwendung, bei der die Position eines Sprite-Objekts beispielsweise anhand seiner Zuordnung zu einem bestimmten Container festgelegt werden soll, können Sie mithilfe eines Dictionary-Objekts jedes Sprite-Objekt einem Container zuordnen.

Mit dem folgenden Code werden drei Instanzen der Sprite-Klasse erstellt, die als Schlüssel für das Dictionary-Objekt dienen. Jedem Schlüssel wird als Wert entweder GroupA oder GroupB zugewiesen. Die Werte können jeden Datentyp aufweisen. In diesem Beispiel sind GroupA und GroupB jedoch Instanzen der Object-Klasse. Anschließend können Sie mit dem Array-Zugriffsoperator ( [] ) auf den Wert zugreifen, der mit den einzelnen Schlüsseln verknüpft ist, wie im folgenden Codebeispiel gezeigt:

import flash.display.Sprite; 
import flash.utils.Dictionary; 
 
var groupMap:Dictionary = new Dictionary(); 
 
// objects to use as keys 
var spr1:Sprite = new Sprite(); 
var spr2:Sprite = new Sprite(); 
var spr3:Sprite = new Sprite(); 
 
// objects to use as values 
var groupA:Object = new Object(); 
var groupB:Object = new Object(); 
 
// Create new key-value pairs in dictionary. 
groupMap[spr1] = groupA; 
groupMap[spr2] = groupB; 
groupMap[spr3] = groupB; 
 
if (groupMap[spr1] == groupA) 
{ 
    trace("spr1 is in groupA");  
} 
if (groupMap[spr2] == groupB) 
{ 
    trace("spr2 is in groupB");  
} 
if (groupMap[spr3] == groupB) 
{ 
    trace("spr3 is in groupB");  
}

Iteration mit Objektschlüsseln

Sie können eine Iteration für den Inhalt des Dictionary-Objekts mit einer for..in -Schleife oder einer for each..in -Schleife durchführen. Mit einer for..in -Schleife können Sie die Iteration basierend auf den Schlüsseln durchführen, während bei einer for each..in -Schleife die Iteration auf den jedem Schlüssel zugeordneten Werten basiert.

Verwenden Sie die for..in -Schleife für den direkten Zugriff auf die Objektschlüssel eines Dictionary-Objekts. Sie können auch über den Array-Zugriffsoperator ( [] ) auf die Werte des Dictionary-Objekts zugreifen. Im folgenden Codebeispiel wird das vorherige Beispiel des groupMap -Wörterbuchs verwendet, um die Iteration eines Dictionary-Objekts mit der for..in -Schleife durchzuführen:

for (var key:Object in groupMap) 
{ 
    trace(key, groupMap[key]); 
} 
/* output: 
[object Sprite] [object Object] 
[object Sprite] [object Object] 
[object Sprite] [object Object] 
*/

Verwenden Sie die for each..in -Schleife für den direkten Zugriff auf die Werte eines Dictionary-Objekts. Im folgenden Codebeispiel wird erneut das groupMap -Wörterbuch verwendet, um die Iteration eines Dictionary-Objekts mit der for each..in -Schleife durchzuführen:

for each (var item:Object in groupMap) 
{ 
    trace(item); 
} 
/* output: 
[object Object] 
[object Object] 
[object Object] 
*/

Objektschlüssel und Speicherverwaltung

In Adobe® Flash® Player und Adobe® AIR™ wird mit einem Verfahren zur automatischen Speicherbereinigung (auch Garbage Collection genannt) Speicherplatz freigegeben, der nicht mehr genutzt wird. Wenn es nicht länger Verweise auf ein Objekt gibt, wird es beim nächsten Ausführen der automatischen Speicherbereinigung entfernt und der entsprechende Speicherplatz wird freigegeben. Mit dem folgenden Code werden beispielsweise ein neues Objekt erstellt und dem Objekt ein Verweis auf die myObject -Variable zugewiesen:

var myObject:Object = new Object();

Solange ein Verweis auf das Objekt vorhanden ist, wird der Speicherplatz, den das Objekt belegt, bei der automatischen Speicherbereinigung nicht freigegeben. Wenn der Wert von myObject so geändert wird, dass es auf ein anderes Objekt verweist oder auf den Wert null gesetzt ist, wird der vom ursprünglichen Objekt belegte Speicherplatz bei der Speicherbereinigung freigegeben. Dies erfolgt jedoch nur, wenn keine anderen Verweise auf das ursprüngliche Objekt vorliegen.

Wenn Sie myObject als Schlüssel in einem Dictionary-Objekt verwenden, erstellen Sie damit einen weiteren Verweis auf das ursprüngliche Objekt. Mit dem folgenden Code werden beispielsweise zwei Verweise auf ein Objekt erstellt, die Variable myObject und der Schlüssel im myMap -Objekt:

import flash.utils.Dictionary; 
 
var myObject:Object = new Object(); 
var myMap:Dictionary = new Dictionary(); 
myMap[myObject] = "foo";

Wenn das Objekt, auf das myObject verweist, bei der Speicherbereinigung entfernt werden soll, müssen Sie alle Verweise auf dieses Objekt löschen. In diesem Fall müssen Sie den Wert von myObject ändern und den Schlüssel myObject in myMap löschen, wie im folgenden Codebeispiel dargestellt:

myObject = null; 
delete myMap[myObject];

Wahlweise können Sie mit dem useWeakReference -Parameter des Dictionary-Konstruktors alle Wörterbuchschlüssel in schwache Verweise ändern. Bei der Speicherbereinigung werden schwache Verweise ignoriert, d. h. ein Objekt mit ausschließlich schwachen Verweisen wird bei der Speicherbereinigung entfernt. Im folgenden Codebeispiel müssen Sie den Schlüssel myObject in myMap nicht entfernen, damit das Objekt bei der Speicherbereinigung entfernt wird:

import flash.utils.Dictionary; 
 
var myObject:Object = new Object(); 
var myMap:Dictionary = new Dictionary(true); 
myMap[myObject] = "foo"; 
myObject = null; // Make object eligible for garbage collection.