Как получить доступ к детям детей рекурсивно? - PullRequest
0 голосов
/ 10 марта 2010

У меня есть Canvas, в котором много компонентов, и в них много компонентов.

getChildren () возвращает только дочерние элементы верхнего уровня. Как лучше всего вернуть всех детей (детей, детей, детей и т. Д.).

Ну, я знаю, как это сделать, перебирая детей, но код действительно грязный. Я бы предпочел использовать хорошую рекурсивную функцию. Кто-нибудь писал это раньше? Или для этого есть класс Util?

Ответы [ 3 ]

3 голосов
/ 10 марта 2010
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));
        }
    }
}

}

3 голосов
/ 10 марта 2010

Попробуйте что-то вероятное (обратите внимание, что вы можете возвращать списки рекурсивно, если хотите собрать все ссылки на итерации верхнего уровня)

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)
1 голос
/ 10 марта 2010
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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...