Pastor Pixel Tipps Tutorial Anleitungen Hilfe

Array Actionscript 3

siehe auch meine Tipps Array Actionscript 2
siehe auch Livedocs Adobe Array

Array erzeugen
Array Eigenschaften und Methoden


Das Array wie auch das Object gehört zu den komplexen Datentypen, denn es kann mehrere Werte aufnehmen. Ein Object speichert die Werte in verschiedenen Eigenschaften. Das Array benutzt einen Index oder Schlüssel. Im folgenden wir ein Array instanziiert und mit Werten versehen. Der Index wird automatisch vergeben er beginnt bei 0. Die Datentypen der Werte können unterschiedlich sein.

var tage:Array = new Array("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag");

Über den Array Zugriffsoperator kann man auf das Element zugreifen:

tage[0] // Montag

Man kann über den Array Zugriffsoperator auch ein Array erzeugen. Das folgende Beispiel erzeugt das gleiche Array wie im ersten Beispiel.

var tage:Array = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"];

Hier noch eine weitere Art ein Array zu instanziieren und mit Werten zu versehen. Wie man sieht können die Werte auch später noch angehängt werden.

var tage:Array = new Array();
tage[0] = "Montag";
tage[1] = "Dienstag";
tage[2] = "Mittwoch";
tage[3] = "Donnerstag";
tage[4] = "Freitag";
tage[5] = "Samstag";
tage[6] = "Sonntag";

Wenn man ein Array instanziiert kann man auch die Anzahl der Elemente angeben.

var tage = new Array();
var tage = new Array(7);

array.length
Mit der Eigenschaft length kann man die Anzahl der Arrayelemente erfahren. Die Anzahl ist um 1 höher als der Indexwert des letzten Elementes. Es kann auch Arrayelemente mit undefinierten Inhalt geben, auch die werden gezählt. var tage = new Array(7); hat 7 Elemente mit undefinierten Inhalt.

tage.length;

array.push()
Mit push() werden Elemente am Ende des Arrays angefügt. Der Rückgabewert ist die geänderte Länge des Arrays.

tage.push("Wolkentag", "Regentag");

array.unshift()
Mit unshift() werden Elemente am Anfang des Arrays angefügt. Der Rückgabewert ist die geänderte Länge des Arrays.

tage.unshift("Wolkentag", "Regentag");

array.shift()
Mit shift() wird das erste Element gelöscht. Der Rückgabewert ist der Wert des gelöschen Elements.

tage.shift();

array.pop()
Mit pop() wird das letzte Element gelöscht. Der Rückgabewert ist der Wert des gelöschen Elements.

tage.pop();

array.splice()
Mit splice(startnummer, anzahl) kann man gezielt Elemente innerhalb des Arrays löschen. Die beiden Parameter sind Startindex und Anzahl der zu löschenden Elemente. Im folgenden Beispiel werden die Wochentage Dienstag und Mittwoch gelöscht. Die anderen Elemente rücken dann nach. Das bedeutet, Donnerstag liegt auf index 1, Freitag auf 2 etc. Rückgabewerte sind die gelöschten Elemente.

tage.splice(1,2);

Man kann mit splice() auch Elemente löschen und durch andere Elemente ersetzen. Indem man die Werte der neuen Elemente als Parameter hinter den beiden ersten Parametern aufführt. So werden im folgenden Beispiel die Wochentage Mittwoch, Donnerstag, Freitag durch die englischen Wochentage ersetzt.

tage.splice(2,3, "Wednesday", "Thursday", "Friday");

Man kann mit Splice auch Elemente dazwischen einfügen ohne Elemente zu löschen. Hier werden ab Index 3 (nach Mittwoch) die drei weiteren Elemente eingefügt. Kein Element wird gelöscht die nachfolgenden werden nach hinten verschoben.

tage.splice(3,0, "Mittwoch Morgens", "Mittwoch Mittag", "Mittwoch Abend");

array.reverse()
Mit reverse() wird die Reihenfolge der Elemente umgekehrt.

tage.reverse();

string.split()
string.split() ist keine Array Funktion, aber man kann mit dieser Funktion die Werte eines Strings, die mit einem Trennzeichen voneinander getrennt sind zu einem Array zusammensetzen. Als Parameter wird das Trennzeichen erwartet:

var moebel:String = "Stuhl, Tisch, Schrank";
var mobiliar:Array = moebel.split(",");

array.concat()
Mit concat() werden die Elemente von 2 Arrays zu einem neuen Array zusammengefügt:

var moebel:Array = new Array("Stuhl", "Tisch" , "Schrank");
var geschirr:Array = new Array ("Teller", "Tasse", "Schüssel");
var haushalt:Array = moebel.concat(geschirr);

array.join()
Mit join() werden die Elemente eines Arrays zu einem String zusammengefügt. Als Argument gibt man das Trennzeichen an. Wenn kein Trennzeichen angegeben wird, wird das Komma als Trennzeichen genommen.

var moebel:Array = new Array("Stuhl", "Tisch" , "Schrank");
var moebelString:String = moebel.join("...");

array.toString()
Auch mit array.toString() werden die Elemente eines Arrays zu einem String zusammengefügt. Als Trennzeichen wird das Komma eingesetzt.

var moebel:Array = new Array("Stuhl", "Tisch" , "Schrank");
var moebelString:String = moebel.toString();

Schleifen

Es gibt verschiedene Möglichkeiten die Elemente eines Arrays mit Schleifen zu durchlaufen. Die klassische Möglichkeit ist die for() Schleife

for Schleife

for (var i:uint = 0; i < tage.length; i++)
{
	trace(tage[i]);
}

for- in- Schleife
Die for-in Schleife für Arrays und Objekte liest alle Elemente in eine Variable aus.Sie endet wenn es keine Element mehr gibt. In AS3 geht die die for in Schleife die Elemente in der richtigen Reihenfolge durch. Das ist in AS2 nicht der Fall. Die for-in Schleife ignoriert Elemente die undefined sind.

for (variable in Array)
{
Anweisungen;
}

for (var element in tage)
{
	trace(tage[element]);
}

for-each-in Schleife
siehe auch Beispiele for-each-in Schleife in XML
Die for each in Schleife durchläuft Arrays, Objekte und xml Elemente. Im Gegensatz zur for-in Schleife werden die Werte und nicht die indzies zurückgegeben.

Siehe auch weiter unten for each in bei multidimensionalen Arrays.

for each ( var ele:String in tage)
{
trace(ele);
}

for each(var ele:String in tage)
{
		trace(ele);
}

for-each-in Schleife und mehrdimensionale Arrays

Siehe unten Thema multidimensionale Arrays:
Nehmen wir folgendes Beispiel

var tage:Array = ["Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag"];
var days:Array = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"];
var multi:Array = new Array(tage, days);

Wenn man auf folgende Weise mit einer for-each-in-Schleife darauf zugreift bekommt man 2 Elemente die jeweils wieder aus einem Array bestehen.
Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday

for each (var element in multi)
{
	trace(element);
}

Um auf jedes einzelne Element zuzugreifen kann man 2 for each in Schleifen ineinander verschachteln.

for each (var element in multi)
{
	for each (var ele in element)
	{
		trace(ele);
	}
}

Assoziative Arrays

Ein assoziatives Array benutzt im Index keine Zahl sondern einen String. Man kann diese Arrays auf zwei Arten definieren:

Methode 1 mit dem Array Zugriffsoperator

var monatstage:Array = new Array();
monatstage["Januar"] = 31;
monatstage["Februar"] = 28;
monatstage["März"] = 31;
monatstage["April"] = 30;

Methode 2 mit Punktsyntax

var monatstage:Array = new Array();
monatstage.Januar = 31;
monatstage.Februar = 28;
monatstage.März = 31;
monatstage.April = 30;

Folgende Besonderheiten sind zu beachten

Multidimensionale Arrays

Multidimensionale Arrays sind verschachtelte Arrays.

var tage:Array = ["Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag"];
var days:Array = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"];
var abk:Array = ["mo","di","mi","do","fr","sa","so"];
var multi:Array = new Array(tage, days, abk);

Folgendermaßen greift man darauf zu

multi[0][0]; //Montag
multi[0][1]; //Dienstag
multi[1][3]; //Thursday
multi[2][0]; //mo

Eine andere Schreibweise wäre folgende. Wir erinnern uns, dass man auch über den Arrayzugriffsoperator Werte zuweisen kann.

var multi:Array = [[11,12,13],[21, 22, 23]];
trace(multi[0][2]); //13
trace(multi[1][0]); //21

Eine weitere Schreibweise, mit der man datenbankähnliche Strukturen erstellen kann:

var team:Array =  new Array();
team[0] = ["Walter", "Berg", "Waldheim" ];
team[1] = ["Gisela", "Gans", "Bauerndorf"];
team[2] = ["Frieda", "Frieden", "Friedrichsruh"];
trace(team[0][2]); //Waldheim
trace(team[1][0]); //Gisela
trace(team[2][1]); //Frieden

 

Siehe auch for each in Schleife

Movieclips in Arrays speichern

Hier eine praktische Anwendung für ein Array. In der Bibliothek gibt es einen MC der als Klasse "Kreis" erstellt wurde mit einer Kreisgrafik darin. In einer for Schleife werden Instanzen erzeugt und auf der Bühne plaziert. Die Instanzen werden in einem Array gespeichert. Beim Mouse Click wird das Array durchlaufen und überprüft ob die Position der derzeitigen Mausposition entspricht. Ist das der Fall wird das Display Object gelöscht und aus dem Array entfernt.

import flash.display.Sprite;
import flash.display.Shape;
import flash.events.MouseEvent;

var sprites:Array = new Array();


for (var i:uint = 0; i < 10; i++)
{
	var mc:Kreis  = new Kreis();
	mc.y = 40;
	mc.x = 20 * i + 10;
	
	addChild(mc);
	sprites.push(mc);
}

stage.addEventListener(MouseEvent.CLICK, removeSprite);
function removeSprite(evt:MouseEvent):void
{
	for (var i:uint = 0; i < sprites.length; i++)
	{
		if (sprites[i].hitTestPoint(stage.mouseX,stage.mouseY,true))
		{
			removeChild(DisplayObject(sprites[i]));
			sprites.splice(i,1);
		}
	}
}

Display Objekte im Raster positionieren mittels Schleifen

In den folgenden Beispielen werden Display-Objekte in Reihen und Spalten auf der Bühne angeordnet.

In diesem theoretischen Beispiel werden die Objekte von oben nach unten angeordnet, bis die Anzahl der vorgegebenen Reihen voll ist. Das wird über Modulo erreicht. Modulo gibt den Restbetrag einer Division zurück. 10%3 ergibt 1, denn 10 geteilt durch 3 ergibt 9 Rest 1. siehe dazu meinen AS2 Tipp Mathe. Sobald der Restbetrag 0 ist, also die Anzahl der Spalten erreicht ist, wird die Variable "row" um einen erhöht wird. So erhält man Werte für Reihen und Spalten, womit man Anordnungen auf der Bühne erzeugen kann. Die Gesamtanzahl sollte möglichst durch die Anzahl der Spalten teilbar sein.

var anzahl:uint = 25;
var colCount:uint = 5;
var col:uint = 0;
var row:uint = 0;
 
for(var i:uint=0; i < anzahl; i++)
{
     
    if (i%colCount == 0){
    row++;
    }
	col = i%colCount;
    trace("row "+row+" Col "+col);
}

Die Trace Ausgabe sieht folgendermaßen aus:

row 1 Col 0
row 1 Col 1
row 1 Col 2
row 1 Col 3
row 1 Col 4
row 2 Col 0
row 2 Col 1
row 2 Col 2
row 2 Col 3
row 2 Col 4
row 3 Col 0
row 3 Col 1
row 3 Col 2
row 3 Col 3
row 3 Col 4
row 4 Col 0
row 4 Col 1
row 4 Col 2
row 4 Col 3
row 4 Col 4
row 5 Col 0
row 5 Col 1
row 5 Col 2
row 5 Col 3
row 5 Col 4

Anordnen von MC Instanzen in Reihen und Spalten

In diesem Beispiel werden Objekte der selbst erzeugten MovieClip Klasse "Block" auf der Bühne in Reihen und Spalten angeordnet. Dieses Beispiel ist eine Erweiterung des vorigen Beispiels.

var anzahl:uint = 25;
var colCount:uint = 5;
var col:uint = 0;
var row:uint = 0;
 
for(var i:uint=0; i < anzahl; i++)
{
     
    if (i%colCount == 0){
    row++;
    }
	col = i%colCount;

	var quad:Block = new Block();
	quad.y = row * 45;
	quad.x = col * 45;
	addChild(quad);
}

Arrayelemente nach Zufallsprinzip neu mischen

siehe dazu diese Beispiele http://active.tutsplus.com/tutorials/actionscript/quick-tip-how-to-randomly-shuffle-an-array-in-as3/

Außerdem findet ihr dazu noch einiges in meinen AS2 Tipps zum Thema Array.

In der ersten forSchleife bekommt allNmb der Reihe nach alle Zahlen von 1 bis amount zugewiesen In der zweiten forSchleife, geschieht folgendes.
Aus der Anzahl der Elemente von allNmb, wird eine zufällige Zahl generiert.
Die so erzeugte Zahl bestimmt welches Element von allNmb genommen wird also: allNmb[zufallszahl]
Die darin liegende zahl wird dem Array randNmb am Ende hinzugefügt, mit push();
Ein Beispiel, nehmen wir an im ersten Schleifendurchlauf würde die zuZa = 0 generiert.
Also wird der Wert von Element allNmb[0] welcher 1 ist dem ersten Element von randNmb mit push zugewiesen.
Da das Element von allNmb[0] auch gelöscht wird mit splice, wird diese Zahl 1 nie wieder vorkommen.
Beim nächsten Schleifendurchlauf ist allNmb um ein Element kleiner. Aber da die Zufallszahlen ja sowieso aus allNmb.length generiert werden, gibt es keine Probleme.
Das Spiel beginnt von neuem, bis allNmb keine Elemente mehr hat und alle Nummern in randNmb abgelegt sind, dort allerdings in zufälliger Reihenfolge.

function mixNr(amount:uint):Array
{
	var allNmb:Array = new Array();
	var randNmb:Array = new Array();

	for (var i:uint=1; i <= amount; i++)
	{
		allNmb.push(i);
	}

	for (i=0; i < amount; i++)
	{
		var zuZa:uint = Math.floor(Math.random()*(allNmb.length));
		var curZahl:uint = allNmb.splice(zuZa,1);
		randNmb.push(curZahl);
	}
	return randNmb;
}

trace(mixNr(10).toString());

 

Vector Klasse

Referenzen Adobe /
Die Vector Klasse ist der Array Klasse sehr ähnlich. Alle Elemente haben den gleichen Datentyp.

Im folgenden Beispiel sieht man eine Deklaration eines Vectors. Der Datentyp der Elemente wird auf folgende Weise zugewiesen. .<Datentyp>

 var v:Vector.<String>;
v = new Vector.<String>();
oder Deklaration und Initialisierung
var names:Vector.<String> = new Vector.<String>("h", "a", "l", "l", "o"); 

Siehe auch folgende Tipps bei Adobe