Indexerade arrayerFlash Player 9 och senare, Adobe AIR 1.0 och senare
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 232 - 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 ArrayDen 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 VectorEn 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 litteral 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-syntaxI 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 matris
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
|
|