我有一个movieClip容器,我想把它的所有子节点都移动到一个数组中。 我想一下我用来删除容器的所有子容器的方法,使用while和removechild在0,但我认为它不会在这种情况下工作。有人有解决方案吗? 谢谢你的帮助。
答案 0 :(得分:4)
var parObj:DisplayObjectContainer = Container; /* Is that the name of your MC? */
var kids:Array = []
var kidCount:int = parObj.numChildren;
// please see note on push at bottom
for( var i:int = 0; i < kidCount; i++ ) kids.push( parObj.getChildAt( i ) );
TA-DA!孩子们现在是所有parObj孩子的阵列
作为一个功能:
function getChildren( parObj:DisplayObjectContainer ):Array
{
var kids:Array = []
var kidCount:int = parObj.numChildren;
for( var i:int = 0; i < kidCount; i++ )
kids.push( parObj.getChildAt( i ) );
return kids
}
或者,如果你对矢量有足够的勇气(这个函数的结果只能容纳DisplayObjects,它比普通数组略快):
function getChildren( parObj:DisplayObjectContainer ):Vector.<DisplayObject>
{
var Vector.<DisplayObject> = new Vector.<DisplayObject>();
var kidCount:int = parObj.numChildren;
for( var i:int = 0; i < kidCount; i++ )
kids.push( parObj.getChildAt( i ) );
return kids
}
有人指出,这个循环并没有优化numChildren。我同意(在合理范围内 - 这可能不会成为瓶颈),所以它现在是一个int。 SOer的一个好点。
但是,针对推文与kids[ kids.length ] = parObj.getChildAt( i );
在分配数组索引时,我的经验是push
与arr[ i ] = val
真正产生很大差异的情况,很可能还会发生其他应该优化的事情首先 - 你真的得到一个数百(数千?)次的MovieClip的孩子阵列?那么也许你真的不需要一个DisplayObject数组,也许你需要删除额外的循环并处理所有这些(或多或少)内联。你真的有一千个长度阵列吗?那么你的瓶颈可能与你正在处理一个庞大的,笨拙的数据结构而不是循环本身的事实有关。
我发现push
清晰,明确,最重要,最明显。 arr.push
没时间理解,它是一个自包含的语句,而数组索引赋值至少要求我实际查看。此外,由于push
是方法调用而arr.length
是动态对象的属性,push
也可以防止拼写错误的可能性:arr[ arr.lengt ]
不会导致错误!这是有效的代码!另一方面,arr.pus(value)
会导致TypeError
。不知道世界其他地方,但我没有时间处理模糊不清的错别字。
直接为我分配数组索引是过早的优化。如果您不这么认为,那很好(并且无论如何,请投票给我,这是网站的重点 - 希望我们都同意一个可接受的做法),但push
将是我的标准。 / p>
答案 1 :(得分:0)
您可以使用numChildren
和getChildAt()
的组合来遍历容器中的元素。以下代码假定您正在容器中运行代码。如果不是这种情况,只需在这两个属性前加上容器名称:
var ar:Array = [];
var i:int = 0;
for(i; i<numChildren; i++)
{
var mc:DisplayObject = getChildAt(i);
ar[ar.length] = mc;
}
trace(ar.length);