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

时间:2010-05-26 19:05:40

标签: flex actionscript-3 air

我有一个对象数组。每个对象都有一个名为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;
  }

9 个答案:

答案 0 :(得分: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 );
}

对此的测试如下:

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 );

}

答案 1 :(得分:10)

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

答案 2 :(得分: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")

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

答案 3 :(得分:1)

我没有备份数据,但我的猜测是array.filter可能是最快的。

答案 4 :(得分:1)

一般来说,你应该更喜欢旧的for-loop而不是“for each”和“for each in”,如果你的元素属于同一类型,则使用Vector。如果性能非常重要,您应该考虑使用链接列表。

查看Grant Skinners幻灯片http://gskinner.com/talks/quick/和Jackson Dunstan的博客,了解有关优化的更多信息。

答案 5 :(得分:0)

如果您不介意使用ArrayCollection(它是Array类的包装器),您可以这样做:

private function RemoveSpoke(Name:String, Spokes:Array):Array{
  var ac:ArrayCollection = new ArrayCollection(Spokes);
  for (var i:int=0, imax:int=ac.length; i<imax; i++) {
    if (Spokes[i].hasOwnProperty("Name") && Spokes[i].Name === Name) {
      ac.removeItemAt(i);
      return ac.source;
    }
  }
  return ac.source;
}

答案 6 :(得分:0)

您还可以将ArrayCollection与filterFunction一起使用,以获取对同一个Array对象的视图

答案 7 :(得分:0)

这是一个在可重用性方面的有效功能,允许您做的不仅仅是删除元素。它返回索引,如果找不到则返回-1。

function searchByProp(arr:Array, prop:String, value:Object): int
{
 var item:Object;
 var n: int = arr.length;
 for(var i:int=n;i>0;i--)
 {
  item = arr[i-1];
  if(item.hasOwnProperty(prop))
   if( value == item[prop] )
    return i-1;
 }
 return -1;
}

答案 8 :(得分:0)

也许这种技术(CJ优化的拼接方法)将进一步改善Quasimondo提出的技术:

http://cjcat.blogspot.com/2010/05/stardust-v11-with-fast-array-splicing_21.html