我需要从舞台中删除作为数组一部分的每个对象。我现在所拥有的仅删除其中一个对象。
this.removeChild(enemyList.splice(0)[0]);
我尝试了相同的结果或错误的几种变体。还有另一种方法可以做到这一点,还是我做错了?
另外,硬括号中的零是多少?我在许多教程/解释中都没有看到,但是当我把它拿出来时,我会遇到各种各样的错误。
答案 0 :(得分:2)
您正在做的只是删除数组中的第一个对象。这条线
this.removeChild(enemyList.splice(0)[0]);
基本上是从数组中删除第一个子节点([0]
),并同时将它拼接出数组(enemyList.splice(0)
)。要删除它们,您需要一个循环
您可以选择几个选项:
慢:只要其中有任何对象,就使用while
循环遍历列表。删除每一个并拼接列表以将其从列表中删除(0是位置,1表示我们只想从中拼接一个对象)
while( enemyList.length > 0 )
{
this.removeChild( enemyList[0] );
enemyList.splice( 0, 1 );
}
比特更快:在仍有对象的情况下浏览列表,并删除最后一个。当你在那里时,Pop()
来自阵列
while( enemyList.length > 0 )
{
this.removeChild( enemyList[enemyList.length - 1] );
enemyList.pop();
}
可能比第二个(未测试)快一点,但比第一个快:以相反的顺序遍历数组并删除每个孩子,随着时间的推移进行拼接
var len:int = enemyList.length
for( var i:int = len - 1; i >= 0; i-- )
{
this.removeChild( enemyList[i] );
enemyList.splice( i, 1 );
}
最快:只需浏览数组并删除每个孩子。在循环结束时,通过将数组的长度设置为0来清除数组(这会删除引用并让它被垃圾回收)
var len:int = enemyList.length;
for( var i:int = 0; i < len; i++ )
this.removeChild( enemyList[i] );
// clear the array
enemyList.length = 0;
某些要点:拼接比使用pop()
慢,并且在将对象拼接出来后,运行时需要将所有后续对象向下移动一个空格(例如,如果你拼接敌人列表) [1],那么enemyList [2]需要移动到位置1以弥补差距)。如果你要拼接,总是从后面拼接(因为它更快:没有物体向上移动)。出于同样的原因,pop()
比slice()
更快(删除数组中的第一个对象)
永远不要修改数组(例如splice()
),如果你正在循环它,因为你在循环时修改它的长度。例如,如果您的数组是var a:Array = ["obj1", "obj2", "obj3"]
,并且您通过执行此操作拼接它:
for( var i:int = 0; i < a.length; i++ )
a.splice( i, 1 );
然后在第一遍中,你将删除位置0处的对象(在本例中为“obj1”)。 “obj2”和“obj3”现在分别移动到位置0和1。在下一个循环中,i
将为1(在这种情况下指向“obj3”)并且将被删除。循环现在会停止,即使你还有一个对象。
如果您要通过在循环期间删除对象来修改数组,那么总是向后循环
答案 1 :(得分:0)
您正在做的是通过拼接来删除数组中的索引。而你也错误地使用Array.splice
。
你想要的是enemyList
中的每个敌人,并删除每个敌人。
for (var i:int = 0; i < enemyList.length; i++)
{
this.removeChild(enemyList[i]);
}