Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 如何递归访问子对象的子对象?_Apache Flex_Actionscript 3_Actionscript - Fatal编程技术网

Apache flex 如何递归访问子对象的子对象?

Apache flex 如何递归访问子对象的子对象?,apache-flex,actionscript-3,actionscript,Apache Flex,Actionscript 3,Actionscript,我有一个画布,里面有很多组件,同样,里面也有很多组件 getChildren()仅返回顶级子级。检索所有子对象(子对象的子对象的子对象的子对象等)的最佳方法是什么 嗯,我知道如何通过遍历子对象来实现这一点,但是代码非常混乱。我更喜欢使用一个好的递归函数。以前有人写过这个吗?或者有一个Util类可以这样做吗?尝试一些可能的方法(注意,如果要收集顶级迭代的所有引用,可以递归返回列表) 功能检查(对象:DisplayObject):无效 { if(对象为DisplayObjectContainer)

我有一个画布,里面有很多组件,同样,里面也有很多组件

getChildren()仅返回顶级子级。检索所有子对象(子对象的子对象的子对象的子对象等)的最佳方法是什么

嗯,我知道如何通过遍历子对象来实现这一点,但是代码非常混乱。我更喜欢使用一个好的递归函数。以前有人写过这个吗?或者有一个Util类可以这样做吗?

尝试一些可能的方法(注意,如果要收集顶级迭代的所有引用,可以递归返回列表)

功能检查(对象:DisplayObject):无效
{
if(对象为DisplayObjectContainer)
{
var casted:DisplayObjectContainer=对象作为DisplayObjectContainer
跟踪(“DisplayObjectContainer”,casted.name)
for(变量深度:int=0;深度
私有函数递归(显示:DisplayObjectContainer):无效{
如果(显示){
对于(变量i:int=0;i<\u display.numChildren;i++){
var child:DisplayObject=display.getChildAt(i);
trace(child.name);
if(子对象为DisplayObjectContainer){
recuse(DisplayObjectContainer(child));
}
}
}
}
函数调用返回函数(obj:DisplayObject):无效
{
跟踪(对象名称);
}
//先去看看孩子们。
//最深的物体将首先被访问,以此类推。
//最后参观了舞台。
//使用递归
函数深度优先(对象:显示对象,函数:函数):无效
{
if(!(DisplayObjectContainer的obj实例))
{
func(obj);
返回;
}
var p:DisplayObjectContainer=DisplayObjectContainer(obj);
变量len:Number=p.numChildren;
对于(变量i:Number=0;i
这几乎是相同的解决方案,不是吗?这很顺利,谢谢!更正:_display应该是display西奥:是的,看起来很相似,我在发布我的解决方案时没有看到你的解决方案。所以我拿到支票似乎有点不公平。。。
function inspect(object:DisplayObject):void
{
    if(object is DisplayObjectContainer)
    {
        var casted:DisplayObjectContainer = object as DisplayObjectContainer

        trace("DisplayObjectContainer ", casted.name)

        for(var depth:int = 0; depth < casted.numChildren;depth++)
        {
            inspect(casted.getChildAt(depth))
        }

    }else{

        trace("DisplayObject", object.name );
    }
}


inspect(this)
private function recuse(display : DisplayObjectContainer) : void {
  if(display) {
    for (var i : int = 0;i < _display.numChildren;i++) {
        var child : DisplayObject = display.getChildAt(i);
        trace(child.name);
        if(child is DisplayObjectContainer) {
            recuse(DisplayObjectContainer(child));
        }
    }
}
function theCallbackFunction(obj:DisplayObject):void
{
  trace(obj.name);
}

//Visit the children first.
//Deep most objects will be visited first and so on.
//stage is visited at the end.
//Uses recursion
function depthFirst(obj:DisplayObject, func:Function):void
{
  if(!(obj instanceof DisplayObjectContainer))
  {
    func(obj);
    return;
  }
  var p:DisplayObjectContainer = DisplayObjectContainer(obj);
  var len:Number = p.numChildren;
  for(var i:Number = 0; i < len; i++)
  {
    var child:DisplayObject = p.getChildAt(i);
    depthFirst(child, func);
  }
  func(obj);
}   

//Visit the siblings first.
//stage is visited first, then its children, then the grand children and so on
//No recursion.
function breadthFirst(obj:DisplayObject, func:Function):void
{
  var q:Array = []; 
  q.push(obj);
  var p:DisplayObjectContainer;
  var i:Number, len:Number;
  while(q.length != 0) 
  {     
    var child:DisplayObject = queue.shift();
    func(child);
    if(!(child instanceof DisplayObjectContainer))
      continue;         
    p = DisplayObjectContainer(child);
    len = p.numChildren;
    for(i = 0; i < len; i++) 
      q.push(p.getChildAt(i));
  }     
}

depthFirst(this.stage, theCallbackFunction);
breadthFirst(this.stage, theCallbackFunction);