我有一个列表,其中包含整个应用程序中的显示对象(插入顺序)。
我想处理列表或者自顶向下(父,子)或自底向上(子,父)。唯一的要求是父节点在任何子节点之前处理,反之亦然,子节点在其父节点之前处理。
什么是好的方法?
编辑:这个问题不是关于排序列表。它是关于性能检索一个特定的显示对象的深度。
Edit2:例子
显示列表:
A (root)
B1
C1
C2
D1
B2
C3
D2
D3
C4
D4
B3
C5
D5
B4
C6
B5
我的列表:
list = [E1, F4, A, B2, B1, C3, ..., N9, N8]
自下而上:
N9, N8, F4, E1, C3, B2, B1, A
自上而下:A, B2, B1, C3, E1, F4, N9, N8
注意:
无论N9在N8之前还是N8在N9之前。重要的是,任何N在M之前(第一次运行),或任何M在其子N*之前(第二次运行)。
如果我没理解错的话:
// bottom up
var num:int = parent.numChildren;
var child:DisplayObject = null;
for( var i:int = num - 1; i >= 0; i-- )
{
child = parent.getChildAt( i );
// do whatever
}
// top down
num = parent.numChildren;
for( i = 0; i < num; i++ )
{
child = parent.getChildAt( i );
// do whatever
}
编辑:好,根据你的例子,你可以用递归来做这个。比如:
private var m_order:Vector.<DisplayObject> = new Vector.<DisplayObject>;
private function _doSomething( dObj:DisplayObject ):void
{
// do my thing here
// add to our order vector
this.m_order.push( dObj );
var container:DisplayObjectContainer = dObj as DisplayObjectContainer;
if( container == null || container.numChildren == 0 )
return;
var len:int = container.numChildren;
for ( var i:int = 0; i < len; i++ )
this._doSomething( container.getChildAt( i ) );
}
// then start it off with
this._doSomething( root );
如果你可以从上到下,这应该是盛大的。要返回(自下而上),只需反向遍历m_order Vector
。
如果你需要先从下往上做,那么先创建数组,然后反向遍历,然后正常遍历。
这是我能想到的最简单的方法。还有,不是德语,是爱尔兰语:)
Flex组件有nestLevel,但我不认为纯Flash/As3对象有。