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