6 Stimmen

Eine effizientere Möglichkeit, ein Element aus einem Array in Actionscript 3 zu entfernen

Ich habe ein Array von Objekten. Jedes Objekt hat eine Eigenschaft namens name. Ich möchte effizient ein Objekt mit einem bestimmten Namen aus dem Array entfernen. Ist das der BESTE Weg?

  private function RemoveSpoke(Name:String):void {
    var Temp:Array=new Array;
    for each (var S:Object in Spokes) {
      if (S.Name!=Name) {
        Temp.push(S);
      }
    }
    Spokes=Temp;
  }

12voto

Quasimondo Punkte 2395

Wenn Sie bereit sind, etwas Speicher für eine Lookup-Tabelle zu verwenden, wird dies ziemlich schnell sein:

private function remove( data:Array, objectTable:Object, name:String):void {
var index:int = data.indexOf( objectTable[name] );
objectTable[name] = null;
data.splice( index, 1 );
}

Der Test dafür sieht so aus:

private function test():void{

var lookup:Object = {};
var Spokes:Array = [];
for ( var i:int = 0; i < 1000; i++ )
{
    var obj:Object = { name: (Math.random()*0xffffff).toString(16), someOtherProperty:"blah" };
    if ( lookup[ obj.name ] == null )
    {
        lookup[ obj.name ] = obj;
        Spokes.push( obj );
    }
}

var t:int = getTimer();
for ( var i:int = 0; i < 500; i++ )
{
    var test:Object = Spokes[int(Math.random()*Spokes.length)];
    remove(Spokes,lookup,test.name)
}
trace( getTimer() - t );

}

10voto

LeManu Punkte 101

MyArray.splice(myArray.indexOf(myInstance), 1);

5voto

Joa Ebert Punkte 6425

Der schnellste Weg wird so sein:

function remove(array: Array, name: String): void {
  var n: int = array.length
  while(--n > -1) {
    if(name == array[n].name) {
      array.splice(n, 1)
      return
    }
   }
}

remove([{name: "hi"}], "hi")

Sie können auch die return-Anweisung entfernen, wenn Sie alle Elemente entfernen möchten, die der angegebenen Bedingung entsprechen.

1voto

James Ward Punkte 29264

Ich habe keine Daten, um es zu belegen, aber meine Vermutung ist, dass [array.filter](http://livedocs.adobe.com/flex/3/langref/Array.html#filter()) möglicherweise am schnellsten ist.

1voto

DieTapete Punkte 11

Im Allgemeinen sollten Sie die alte for-Schleife "for each" und "for each in" vorziehen und Vector verwenden, wenn Ihre Elemente vom gleichen Typ sind. Wenn Leistung wirklich wichtig ist, sollten Sie erwägen, eine verkettete Liste zu verwenden.

Schauen Sie sich die Folien von Grant Skinner unter http://gskinner.com/talks/quick/ und den Blog von Jackson Dunstan für weitere Informationen zur Optimierung an.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X