I indexerade arrayer lagras en serie med en eller flera värden organiserade så att varje värde kan hämtas med hjälp av ett heltalsvärde utan tecken. Den första indexposten har alltid talet 0 och indexvärdet ökar med 1 för varje efterföljande element som du lägger till i arrayen. I ActionScript 3.0 används två klasser som indexerade arrayer: klassen Array och klassen Vector.
För indexerade arrayer används ett 32-bitars heltal utan tecken som indexvärde. Maxstorleken för en indexerad array är 2
32
- 1 eller 4 294 967 295. Ett försök att skapa en array som är större än maxstorleken leder till ett körningsfel.
Om du vill komma åt ett enskilt element i en indexerad array använder du operatorn för arrayåtkomst (
[]
) för att ange indexpositionen för det element som du vill komma åt. Följande kod representerar till exempel det första elementet (elementet vid index 0) i en indexerad array med namnet
songTitles
:
songTitles[0]
Kombinationen av arrayvariabelnamnet följt av indexet inom hakparentes fungerar som en enskild identifierare. (Med andra ord kan den användas på samma sätt som ett variabelnamn.) Du kan tilldela ett värde till ett indexerat arrayelement genom att använda namnet och indexet på vänster sida i en tilldelningssats:
songTitles[1] = "Symphony No. 5 in D minor";
Du kan på samma sätt hämta värdet för ett indexerat arrayelement genom att använda namnet och indexet på höger sida i en tilldelningssats:
var nextSong:String = songTitles[2];
Du kan också använda en variabel inom hakparentes i stället för att ange ett explicit värde. (Variabeln måste innehålla ett heltalsvärde som inte är negativt, ett positivt heltal eller en Number-instans med positivt heltal.) Den här metoden används för det mesta för att ”slinga igenom” elementen i en indexerad array och utföra en åtgärd på några eller alla element. Den här tekniken visas i följande kod. Koden använder en slinga för att få tillgång till varje värde i ett Array-objekt med namnet
oddNumbers
. Den använder programsatsen
trace()
för att skriva ut varje värde i formuläret ”oddNumber[
index
] =
value
”:
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());
}
Klassen Array
Den första typen av indexerad array är klassen Array. En Array-instans kan innehålla värden för alla datatyper. Samma Array-objekt kan innehålla objekt som har olika datatyper. En enda Array-instans kan till exempel ha ett String-värde i index 0, en Number-instans i index 1 och ett XML-objekt i index 2.
Klassen Vector
En annan typ av indexerad array som finns i ActionScript 3.0 är klassen Vector. En Vector-instans är en
typbestämd array
, vilket innebär att alla element i en Vector-instans alltid har samma datatyp.
Obs!
Klassen Vector är tillgänglig från och med Flash Player 10 och Adobe AIR 1.5.
När du deklarerar en Vector-variabel eller instansierar ett Vector-objekt anger du explicit datatypen för objekten som Vector kan innehålla. Den angivna datatypen är dess
bastyp
. Under körning och kompilering (i strikt läge) kontrolleras all kod som ställer in värdet för ett Vector-element eller hämtar ett värde från en Vector. Om datatypen för objektet som läggs till eller hämtas inte motsvarar Vectors bastyp inträffar ett fel.
Förutom datatypsbegränsningen innehåller klassen Vector andra begränsningar som skiljer den från klassen Array:
-
En Vector är en kompakt array. Ett Array-objekt kan ha värden i indexen 0 och 7 även om det inte har några värden i position 1 till och med 6. En Vector måste emellertid ha ett värde (eller
null
) i varje index.
-
En Vector kan också ha fast längd. Det innebär att antalet element som Vectorn innehåller inte kan ändras.
-
Åtkomsten till element tillhörande en Vector är avgränsningskontrollerad. Du kan aldrig läsa ett värde från ett index som är större än det sista elementet (
length
- 1). Du kan aldrig ställa in ett värde med ett index som ligger mer än en position efter det sista indexet. (Med andra ord kan du bara ställa in ett värde vid ett befintligt index eller vid index
[length]
.)
Genom sina begränsningar har en Vector tre stora fördelar gentemot en Array-instans vars element alla är instanser av en enda klass:
-
Prestanda: åtkomst och upprepning av arrayelement går mycket snabbare när du använder en Vector-instans än när du använder en Array-instans.
-
Typsäkerhet: i strikt läge kan kompileraren identifiera datatypfel. Exempel på sådana fel kan vara att tilldela ett värde med fel datatyp till en Vector eller förvänta fel datatyp när ett värde läses från en Vector. Under körning kontrolleras också datatyperna när data läggs till i eller läses från ett Vector-objekt. Observera emellertid, att när du använder metoderna
push()
eller
unshift()
för att lägga till värden till en Vector kontrolleras inte argumentens datatyper vid kompileringen. När du använder dessa metoder kontrolleras värdena ändå under körning.
-
Tillförlitlighet: intervallkontroller av körning (eller kontroller med fast längd) har betydligt högre tillförlitlighet än arrayer.
Förutom dessa begränsningar och fördelar, fungerar klassen Vector ungefär som klassen Array. Ett Vector-objekts egenskaper och metoder liknar, och är i vissa fall identiska med, egenskaper och metoder för en array. I de flesta fall där du skulle kunna använda en array vars element är av samma datatyp, är en Vector-instans att föredra.
Skapa arrayer
Du kan använda flera olika metoder när du skapar en Array-instans eller Vector-instans. Metoderna för de olika arraytyperna skiljer sig emellertid åt något.
Skapa en Array-instans
Du skapar ett Array-objekt genom att anropa konstruktorn
Array()
eller genom att använda literal Array-syntax.
Konstruktorfunktionen
Array()
kan användas på tre sätt. Du kan till att börja med anropa konstruktorn utan argument och får då en tom array. Du kan använda egenskapen
length
i klassen Array för att bekräfta att arrayen saknar element. I följande exempel anropas konstruktorn
Array()
utan några argument:
var names:Array = new Array();
trace(names.length); // output: 0
För det andra kan du använda tal som den enda parametern i konstruktorn
Array()
. Nu skapas en array med den angivna längden, där varje elements värde anges som
undefined
. Argumentet måste vara ett heltal utan tecken mellan 0 och 4 294 967 295. I följande exempel anropas konstruktorn
Array()
med ett enda numeriskt argument:
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
För det tredje kan du anropa konstruktorn och skicka en lista med element som parametrar. Då skapas en array med de element som motsvarar var och en av parametrarna. I följande exempel skickas tre argument till konstruktorn
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
Du kan också skapa arrayer med Array-litteraler. En Array-litteral kan tilldelas direkt till en arrayvariabel som i följande exempel:
var names:Array = ["John", "Jane", "David"];
Skapa en Vector-instans
Du skapar en Vector-instans genom att anropa konstruktorn
Vector.<T>()
. Du kan också skapa en Vector-instans genom att anropa den globala funktionen
Vector.<T>()
. Den funktionen konverterar ett angivet objekt till en Vector-instans. I Flash Professional CS5 och senare, Flash Builder 4 och senare samt Flex 4 och senare, går det också att skapa en vektorinstans med hjälp av litteral Vector-syntax.
När du deklarerar en Vector-variabel (eller en Vector-metodparameter eller en metodreturtyp) anger du bastypen för Vector-variabeln. Du anger också bastypen när du skapar en Vector-instans genom att anropa konstruktorn
Vector.<T>()
. Med andra ord, när du använder termen
Vector
i ActionScript åtföljs den av en bastyp.
Du anger Vectorns bastyp med typparametersyntax. Typparametern kommer omedelbart efter ordet
Vector
i koden. Den består av en punkt (
.
), följt av basklassnamnet omgivet av vinkelparenteser (
<>
), vilket visas i detta exempel:
var v:Vector.<String>;
v = new Vector.<String>();
På exemplets första rad deklareras variabeln
v
som en Vector.
<String>
-instans. Med andra ord representerar den en indexerad array, som bara kan innehålla String-instanser. Den andra raden anropar konstruktorn
Vector()
för att skapa en instans av samma Vector-typ (det vill säga en Vector, vars element alla är String-objekt). Den tilldelar det objektet till
v
.
Använda konstruktorn Vector.<T>()
Om du använder konstruktorn
Vector.<T>()
utan några argument skapas en tom Vector-instans. Du kan testa att en Vector är tom genom att kontrollera dess
length
-egenskap. Följande kod anropar till exempel konstruktorn
Vector.<T>()
utan argument:
var names:Vector.<String> = new Vector.<String>();
trace(names.length); // output: 0
Om du vet i förväg hur många element som en Vector behöver från början, kan du fördefiniera antalet. Om du vill skapa en Vector med ett visst antal element skickar du antalet element som den första parametern (parametern
length
). Eftersom Vector-element inte kan vara tomma, fylls elementen med instanser av bastypen. Om bastypen är en referenstyp som tillåter
null
-värden innehåller alla element
null
. Annars innehåller alla element standardvärdet för klassen. En uint-variabel kan till exempel inte vara
null
. I följande kodexempel skapas därför Vectorn med namnet
ages
med sju element, där vart och ett innehåller värdet 0:
var ages:Vector.<uint> = new Vector.<uint>(7);
trace(ages); // output: 0,0,0,0,0,0,0
Med konstruktorn
Vector.<T>()
kan du slutligen också skapa en Vector med fast längd genom att skicka
true
för den andra parametern (parametern
fixed
). I så fall skapas Vectorn med angivet antal element, vilket inte kan ändras. Du kan emellertid fortfarande ändra värdena på elementen i en Vector med fast längd.
Använda konstruktorn för litteral Vector-syntax
I Flash Professional CS5 och senare, Flash Builder 4 och senare samt Flex 4 och senare kan du ange en lista med värden till konstruktorn för
Vector.<T>()
för att ange Vectorns startvärden:
// var v:Vector.<T> = new <T>[E0, ..., En-1 ,];
// For example:
var v:Vector.<int> = new <int>[0,1,2,];
Följande information gäller för denna syntax:
-
Det efterföljande kommat är valfritt.
-
Tomma objekt i arrayen stöds inte. En sats som
var v:Vector.<int> = new <int>[0,,2,]
genererar till exempel ett kompileringsfel.
-
Det går inte att ange en standardlängd för Vector-instansen. I stället är längden densamma som antalet element i initieringslistan.
-
Det går inte att ange om Vector-instansen har en fast längd. Använd i stället egenskapen
fixed
.
-
Dataförlust eller fel kan inträffa om objekt som anges som värden inte stämmer överens med den angivna typen. Till exempel:
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
Använda konstruktorn Vector.<T>().
Förutom konstruktorn
Vector.<T>()
och konstruktorn för litteral Vector-syntax kan du använda den globala funktionen
Vector.<T>()
när du skapar ett Vector-objekt. Den globala funktionen
Vector.<T>()
är en konverteringsfunktion. När du anropar den globala funktionen
Vector.<T>()
anger du bastypen för den Vector som metoden returnerar. Du skickar en enda indexerad array (Array- eller Vector-instans) som ett argument. Metoden returnerar sedan en Vector med angiven bastyp som innehåller värdena i källarrayargumentet. Följande kodexempel visar syntaxen för anrop av den globala funktionen
Vector.<T>()
:
var friends:Vector.<String> = Vector.<String>(["Bob", "Larry", "Sarah"]);
Den globala funktionen
Vector.<T>()
utför datatypskonvertering på två nivåer. För det första, när en Array-instans skickas till funktionen returneras en Vector-instans. För det andra, när källarrayen är en Array- eller Vector-instans försöker funktionen att konvertera källarrayens element till värden av bastypen. Vid konverteringen används de vanliga konverteringsreglerna för ActionScript-datatyper. Följande kodexempel konverterar String-värdena i källarrayen till heltal i den resulterande Vectorn. Decimaldelen av det första värdet (
"1.5"
) kortas av, och det ickenumeriska tredje värdet (
"Waffles"
) konverteras till 0 i resultatet:
var numbers:Vector.<int> = Vector.<int>(["1.5", "17", "Waffles"]);
trace(numbers); // output: 1,17,0
Om något av källelementen inte kan konverteras inträffar ett fel.
När koden anropar den globala funktionen
Vector.<T>()
, och ett element i källarrayen är en instans av en underklass i den angivna bastypen, läggs elementet till i den resulterande vektorn (inget fel inträffar). Att använda den globala funktionen
Vector.<T>()
är det enda sättet att konvertera en vektor med bastypen
T
till en vektor med en bastyp som är en överordnad klass till
T
.
Infoga arrayelement
Det vanligaste sättet att lägga till ett element i en indexerad array är att använda operatorn för arrayåtkomst (
[]
). Om du vill ställa in värdet för ett indexerat arrayelement ska du använda Array- eller Vector-objektnamnet och indexnumret på vänster sida i en tilldelningssats:
songTitles[5] = "Happy Birthday";
Om en Array eller Vector inte redan har ett element vid detta index, skapas indexet och värdet lagras där. Om det finns ett värde vid detta index, ersätter det nya värdet det befintliga.
Med ett Array-objekt kan du skapa ett element vid valfritt index. Med ett Vector-objekt kan du emellertid bara tilldela ett värde till ett befintligt index eller till nästa tillgängliga index. Nästa tillgängliga index motsvarar Vector-objektets
length
-egenskap. Det säkraste sättet att lägga till ett nytt element i ett Vector-objekt är att använda kod som den nedan:
myVector[myVector.length] = valueToAdd;
Tre av metoderna i klasserna Array och Vector –
push()
,
unshift()
och
splice()
– används för att infoga element i en indexerad array. Metoden
push()
lägger till ett eller flera element i slutet av en array. Detta innebär att det element som senast infogades i arrayen med metoden
push()
får det högsta indexvärdet. Med metoden
unshift()
infogas ett eller flera element i början av en array, vilket alltid är vid indexvärdet 0. Metoden
splice()
används för att infoga valfritt antal objekt vid ett angivet index i arrayen.
I följande exempel visas alla tre metoderna. En array med namnet
planets
skapas för att lagra namnen på planeterna i den ordning de ligger från solen. Till att börja med anropas metoden
push()
för att lägga till det första objektet,
Mars
. Därefter anropas metoden
unshift()
för att lägga till ett objekt,
Mercury
, som ska ligga först i arrayen. Slutligen anropas metoden
splice()
för att infoga objekten
Venus
och
Earth
efter
Mercury
, men före
Mars
. Det första argumentet som skickas till
splice()
, heltalet 1, anger att infogningen ska börja vid index 1. Det andra argumentet som skickas till
splice()
, heltalet 0, anger att inga objekt ska raderas. Det tredje och fjärde argumentet som skickas till
splice()
,
Venus
och
Earth
, är de objekt som ska infogas.
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
Metoderna
push()
och
unshift()
returnerar båda ett heltal utan tecken, som representerar längden på den ändrade arrayen. Metoden
splice()
returnerar en tom array när den används för att infoga element, vilket kan tyckas underligt, men blir mer begripligt i ljuset av den flexibilitet som metoden
splice()
uppvisar. Du kan använda metoden
splice()
både för att infoga element i en array och för att ta bort element från en array. När du använder metoden
splice()
för att ta bort element returneras en array som innehåller de borttagna elementen.
Obs!
Om ett Vector-objekts
fixed
-egenskap är
true
kan det totala antalet element i vektorn inte ändras. Om du försöker att lägga till ett nytt element i en Vector med fast längd med de metoder som beskrivs här, inträffar ett fel.
Hämta värden och ta bort arrayelement
Det enklaste sättet att hämta värdet på ett element från en indexerad array är att använda operatorn för arrayåtkomst (
[]
). Om du vill hämta värdet för ett indexerat arrayelement ska du använda Array- eller Vector-objektnamnet och indexnumret på höger sida i en tilldelningssats:
var myFavoriteSong:String = songTitles[3];
Det går att försöka hämta ett värde från en Array eller Vector genom att använda ett index där det inte finns några element. I så fall returnerar ett Array-objekt värdet odefinierat och en Vector returnerar ett RangeError-undantag.
Tre metoder i klasserna Array och Vector –
pop()
,
shift()
och
splice()
– används för att ta bort element. Metoden
pop()
används för att ta bort ett element från slutet av arrayen. Den tar med andra ord bort elementet med det högsta indexvärdet. Metoden
shift()
används för att ta bort ett element från början av arrayen, vilket innebär att den alltid tar bort elementet vid indexvärdet 0. Metoden
splice()
, som också kan användas för att infoga element, tar bort ett godtyckligt antal element med början från det indexvärde som anges i det första argumentet som skickas till metoden.
I följande exempel används alla tre metoder för att ta bort element från en Array-instans. En array med namnet
oceans
skapas för att lagra namnen på de stora världshaven. Vissa av namnen i arrayen är sjöar och inte världshav, så dessa måste tas bort.
Först används metoden
splice()
för att ta bort objekten
Aral
och
Superior
och för att infoga
Atlantic
och
Indian
. Det första argumentet som skickas till
splice()
, heltalet 2, anger att åtgärden ska starta med det tredje objektet i listan, alltså vid index 2. Det andra argumentet, 2, anger att två objekt ska tas bort. De återstående argumenten,
Atlantic
och
Indian
, är värden som ska infogas vid index 2.
Därefter används metoden
pop()
för att ta bort det sista elementet i arrayen,
Huron
. Slutligen används metoden
shift()
för att ta bort det första elementet i arrayen,
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
Metoderna
pop()
och
shift()
returnerar båda det objekt som togs bort. Datatypen för Array-instansens returnerade värde är Object eftersom arrayer kan innehålla värden av alla datatyper. För en Vector-instans är datatypen för det returnerade värdet bastypen för Vectorn. Metoden
splice()
returnerar en array eller vektor som innehåller de borttagna värdena. Du kan ändra arrayexemplet
oceans
så att anropet till
splice()
tilldelar den returnerade arrayen till en ny arrayvariabel, enligt följande:
var lakes:Array = oceans.splice(2, 2, "Arctic", "Atlantic");
trace(lakes); // output: Aral,Superior
Du kan träffa på kod där operatorn
delete
används på ett element i ett Array-objekt. Operatorn
delete
anger värdet för ett arrayelement som
undefined
, men elementet tas inte bort från arrayen. I följande exempel används operatorn
delete
på det tredje elementet i arrayen
oceans
, men längden på arrayen är fortfarande 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
Du kan korta av en array eller vektor med hjälp av en arrays
length
-egenskap. Om du ställer in egenskapen
length
för en indexerad array på en längd som är mindre än den aktuella längden på arrayen, kortas arrayen av och de element som lagras vid indexnummer högre än det nya värdet på
length
minus 1 tas bort. Om till exempel arrayen
oceans
sorteras så att alla giltiga poster finns i början av arrayen, kan du använda egenskapen
length
för att ta bort posterna i slutet av arrayen, vilket visas i följande kod:
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"];
oceans.length = 2;
trace(oceans); // output: Arctic,Pacific
Obs!
Om ett Vector-objekts
fixed
-egenskap är
true
kan det totala antalet element i vektorn inte ändras. Om du försöker att ta bort ett element från eller korta av en Vector med fast längd med de metoder som beskrivs här, inträffar ett fel.
Sortera en array
Det finns tre metoder –
reverse()
,
sort()
och
sortOn()
– som används för att ändra ordningen i en indexerad array genom att sortera den på olika sätt. Alla dessa metoder används för att förändra en befintlig array. I tabellen nedan sammanfattas dessa metoder och deras beteende för Array- och Vector-objekt:
Metod
|
Beteende hos Array
|
Beteende hos Vector
|
reverse()
|
Ändrar ordningen på elementen så att det sista elementet blir det första, det näst sista det andra och så vidare
|
Identiskt med beteendet för Array
|
sort()
|
Med denna kan du sortera arrayens element på olika fördefinierade sätt, till exempel i bokstavs- eller nummerordning. Du kan också ange en anpassad sorteringsalgoritm.
|
Sorterar elementen enligt den anpassade sorteringsalgoritmen som du anger
|
sortOn()
|
Med denna kan du sortera objekt som har en eller flera gemensamma egenskaper, och ange egenskapen eller egenskaperna som du vill använda för att sortera nycklar
|
Finns inte för klassen Vector
|
Metoden reverse()
Metoden
reverse()
har inga parametrar och returnerar inget värde. Du använder den för att kasta om ordningen i arrayen från den aktuella till den omvända. I följande exempel kastas ordningen om på de världshav som finns i arrayen
oceans
:
var oceans:Array = ["Arctic", "Atlantic", "Indian", "Pacific"];
oceans.reverse();
trace(oceans); // output: Pacific,Indian,Atlantic,Arctic
Grundläggande sortering med metoden sort() (enbart klassen Array)
För en Array-instans ordnar metoden
sort()
elementen i en array med hjälp av
standardsorteringsordningen
. En standardsorteringsordning kännetecknas av följande:
-
Sorteringen är skiftlägeskänslig, vilket betyder att versaler sorteras före gemener. Till exempel kommer bokstaven D före bokstaven b.
-
Sorteringen är stigande vilket innebär att lägre teckenkoder (som A) kommer före högre teckenkoder (som B).
-
Sorteringen placerar identiska värden intill varandra utan någon speciell ordning.
-
Sorteringen är strängbaserad, vilket innebär att element konverteras till strängar innan de jämförs (till exempel kommer 10 före 3 eftersom strängen
"1"
har lägre teckenkod än strängen
"3"
).
Det kan emellertid finnas tillfällen då du vill sortera arrayen utan hänsyn till versaler eller gemener, i fallande ordning eller så kanske du vill att arrayer som innehåller siffror ska sorteras numeriskt och inte alfabetiskt. Klassen Arrays
sort()
-metod har en
options
-parameter, som används för att ändra förutsättningarna för standardsorteringsordningen. Alternativen definieras med hjälp av ett antal statiska konstanter i klassen Array enligt följande lista:
-
Array.CASEINSENSITIVE
: Detta alternativ använder du när du inte vill ta hänsyn till versaler och gemener. Nu kommer gemenen b att komma före versalen D.
-
Array.DESCENDING:
Detta alternativ leder till fallande sorteringsordning. Stigande är standard. Bokstaven B kommer till exempel före bokstaven A.
-
Array.UNIQUESORT:
Detta alternativ leder till att sorteringen avbryts om två identiska värden hittas.
-
Array.NUMERIC:
Detta alternativ används för numerisk sortering så att 3 kommer före 10.
I följande exempel visas några av dessa alternativ. En array med namnet
poets
skapas och sorteras med flera olika alternativ.
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
Anpassad sortering med metoden sort() (klassen Array och klassen Vector)
Förutom den grundläggande sorteringen som finns för ett Array-objekt kan du också definiera en anpassad sorteringsregel. Den här tekniken är den enda formen av
sort()
-metoden som finns för klassen Vector. Du definierar en anpassad sortering genom att skriva en anpassad sorteringsfunktion och skicka den som ett argument till metoden
sort()
.
Om du exempelvis har en lista med namn där varje listelement består av personens fullständiga namn, men där du vill sortera listan efter efternamnet, måste du använda en anpassad sorteringsfunktion för att tolka varje element och använda efternamnet i sorteringsfunktionen. I följande exempel visas hur detta kan göras med en anpassad funktion som används som en parameter i metoden
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
I den anpassade sorteringsfunktionen
orderLastName()
används ett reguljärt uttryck för att extrahera efternamnet från varje element för jämförelseoperationen. Funktionsidentifieraren
orderLastName
används som den enda parametern när metoden
sort()
anropas i arrayen
names
. Sorteringsfunktionen accepterar två parametrar,
a
och
b
, eftersom den arbetar med två arrayelement samtidigt. Sorteringsfunktionens returnerade värde anger hur elementen ska sorteras:
-
Om returvärdet är -1 visar det att den första parametern,
a
, kommer före den andra parametern,
b
.
-
Om returvärdet är 1 visar det att den andra parametern,
b
, kommer före den första,
b
.
-
Om returvärdet är 0 visar det att elementen har samma sorteringsprioritet.
Metoden sortOn() (enbart klassen Array)
Metoden
sortOn()
är utformad för Array-objekt med element som innehåller objekt. Dessa objekt förväntas ha minst en gemensam egenskap, som kan användas som sorteringsnyckel. Om du använder metoden
sortOn()
för andra typer av arrayer kommer du att få oväntade resultat.
Obs!
Klassen Vector har ingen
sortOn()
-metod. Den här metoden finns bara för Array-objekt.
I följande exempel revideras arrayen
poets
så att varje element blir ett objekt i stället för en sträng. Varje objekt kommer nu att innehålla både poetens efternamn och födelseår.
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"});
Du kan använda metoden
sortOn()
för att sortera arrayen efter egenskapen
born
. Metoden
sortOn()
definierar två parametrar,
fieldName
och
options
. Argumentet
fieldName
måste specificeras som en sträng. I följande exempel anropas
sortOn()
med två argument, ”
born"
och
Array.NUMERIC
. Argumentet
Array.NUMERIC
används för att se till att sorteringen görs numeriskt i stället för alfabetiskt. Detta är en bra vana även när alla tal har samma antal siffror, eftersom det ser till att sorteringen kommer att fungera som du förväntar dig även om ett tal med färre eller fler siffror läggs till arrayen senare.
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
*/
Sortera utan att ändra den ursprungliga arrayen (enbart klassen Array)
Metoderna
sort()
och
sortOn()
används vanligtvis för att förändra en array. Om du vill sortera en array utan att ändra den befintliga arrayen skickar du konstanten
Array.RETURNINDEXEDARRAY
som en del av parametern
options
. Detta leder till att metoden returnerar en ny array som visar sorteringen och som lämnar den ursprungliga arrayen oförändrad. Arrayer som returneras av metoder är enkla arrayer med indexvärden som visar den nya sorteringsordningen och som inte innehåller några element från den ursprungliga arrayen. Om du till exempel vill sortera arrayen
poets
efter födelseår utan att ändra arrayen, tar du med konstanten
Array.RETURNINDEXEDARRAY
som en del av det argument som skickas för parametern
options
.
I följande exempel lagras den returnerade indexinformationen i en array med namnet
indices
. Därefter används arrayen
indices
i kombination med den oförändrade arrayen
poets
för att ordna poeterna efter födelseår:
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
*/
Ställa frågor mot en array
Fyra metoder i klasserna Array och Vector –
concat()
,
join()
,
slice()
och
toString()
– används för att ställa frågor mot arrayen och inte för att förändra den. Metoderna
concat()
och
slice()
returnerar båda nya arrayer, medan metoderna
join()
och
toString()
båda returnerar strängar. I metoden
concat()
tas en ny array eller lista med element som argument och kombinerar den med en befintlig array för att skapa en ny array. Metoden
slice()
har två parametrar med de passande namnen
startIndex
och
endIndex
. Den returnerar en ny array som innehåller en kopia av de element som delades upp från den befintliga arrayen. Uppdelningen börjar med elementet vid
startIndex
och slutar med elementet precis före
endIndex
. Detta kanske behöver upprepas: elementet vid
endIndex
ingår INTE i returvärdet.
I följande exempel används
concat()
och
slice()
för att skapa nya arrayer med hjälp av element från andra arrayer:
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
Du kan använda metoderna
join()
och
toString()
för att ställa frågor mot arrayen och returnera dess innehåll som en sträng. De båda metoderna är identiska om inga parametrar används för metoden
join()
, eftersom de returnerar en sträng med en kommaseparerad lista med alla element i strängen. För metoden
join()
, till skillnad från metoden
toString()
, accepteras en parameter med namnet
delimiter
, vilket innebär att du kan välja vilken symbol som ska användas som avgränsare mellan elementen i den returnerade strängen.
I nästa exempel skapas en array med namnet
rivers
som anropar både
join()
och
toString()
för att returnera värdena i arrayen som en sträng. Metoden
toString()
används för att returnera kommaseparerade värden (
riverCSV
), medan metoden
join()
används för att returnera värden som separeras med tecknet
+
.
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
En sak som du bör tänka på när du använder metoden
join()
är alla kapslade Array- och Vector-instanser alltid returneras med kommaavgränsade värden, oavsett vilken avgränsare du anger för elementen i huvudarrayen, vilket framgår av följande exempel:
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
|
|
|