在Actionscript 3中从数组中删除元素的更有效方法

Jos*_*hua 6 apache-flex air actionscript-3

我有一个对象数组.每个对象都有一个名为name的属性.我想有效地从数组中删除具有特定名称的对象.这是最好的方式吗?

  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;
  }
Run Code Online (Sandbox Code Playgroud)

Qua*_*ndo 12

如果你愿意在查找表上花一些内存,这将非常快:

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

对此的测试如下所示:

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 );
Run Code Online (Sandbox Code Playgroud)

}


小智 10

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


Joa*_*ert 5

最快的方法是:

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")
Run Code Online (Sandbox Code Playgroud)

如果要删除与给定谓词匹配的所有alement,也可以删除return语句.

  • 我允许自己比较你的"最快"与我的比较并带来坏消息:从1000个元素阵列中删除500个元素 - 你的34毫秒,我的4毫秒;-) (7认同)