Sie sollten sich bewusst sein, dass sortOn()
sortiert die Elemente in einem Array nach Eigenschaften in der Anordnung. Das Array sollte die folgenden Merkmale aufweisen:
- Das Array ist ein indiziertes Array, kein assoziatives Array.
- Jedes Element des Arrays enthält eine object mit einer oder mehreren Eigenschaften.
- Alle Objekte haben mindestens eine Eigenschaft gemeinsam, deren Werte verwendet werden können, um das Array zu sortieren.
Also, dies ist ein Array:
var a:Array = ["a", "b", "c"]
Dies ist ein Objekt (auch bekannt als assoziatives Array):
var o:Object = {"name":"Tom", "age":21, "single":true}
Und das ist die Art von Struktur, dass Die Methode sortOn()
gilt für:
var a:Array = [
{"name":"Tom", "age":21, "single":true},
{"name":"Dick", "age":36, "single":false},
{"name":"Harry", "age":27, "single":true}
]
Auch wenn Sie eine Variable das Muster NAME:TYPE = VALUE
ist zu erklären, und nicht NAME = TYPE
Hier ist der entsprechende Code. Sie haben die Funktion print()
hinzugefügt, die den Inhalt eines Arrays abbildet, so dass Sie das Vorher und Nachher sehen können.
/* --- Code that wasn't provided --- */
// This creates the data so we can test sorting it.
var genotype:Array = [];
for (var r:int = 0; r < 16; r++) {
var row:Array = [];
for (var c:int = 0; c < 4; c++) {
row.push(Math.floor(Math.random() * 100));
}
genotype.push(row)
}
var fitness:Array = [];
/* --- Modified Original Code --- */
// Loop through the genotype, and create entries in fitness with the sum and index
for (var i:int = 0; i < genotype.length; i++) {
fitness[i] = {"sum":sumArray(genotype[i]), "index":i};
}
function sumArray(a:Array):Number {
// This simply adds up the total values in an array.
var sum:int = 0;
for (var i:int = 0; i < a.length; i++) {
sum += a[i];
}
return sum;
}
fitness.sortOn("sum", Array.NUMERIC); // Sort on the sum property, numerically ascending.
// To sort the original data, I'm going to place it into a new array.
var newGeno:Array = [];
i = 0;
for each (var entry:Object in fitness) {
newGeno[i] = genotype[entry.index];
i++;
}
/* If you want, you can replace the original, simply add...
genotype = newGeno;
*/
trace("--- GENOTYPE ---")
print(genotype);
trace("--- NEW GENO ---")
print(newGeno);
function print(a:Array, prefix:String = ""):void {
for (var i:int = 0; i < a.length; i++) {
if (a[i] is Array) {
trace(prefix + i + ": [Array] " + sumArray(a[i]));
print(a[i], prefix + " ");
} else {
trace(prefix + i + ": " + a[i])
}
}
}