сделать AS3 для каждого цикла динамически знать глубину итерации - PullRequest
0 голосов
/ 24 марта 2012

Надеюсь, я достаточно ясен.

Мой набор данных заполнен У меня есть

 comment:CommentVO;
 comment.replies=[comment:CommentVO,comment:CommentVO,comment:CommentVO];

_comments:Array = [comment:CommentVO,comment:CommentVO,comment:CommentVO]

Я правильно заполнил свой массив _comments и массив ответов в моем объекте CommentVO.

Это работает

   for each (var comment : CommentVO in _comments) {
     trace("TOP COMMENT" + comment.raw_message);

         for each (var comment : CommentVO in comment.replies){ 
           trace("1st DEPTH COMMENT REPLY " + comment.raw_message);

            for each (var comment : CommentVO in comment.replies){  
            trace("2nd DEPTH COMMENT REPLY " + comment.raw_message );

               for each (var comment : CommentVO in comment.replies){   
                 trace("3rd DEPTH COMMENT REPLY " + comment.raw_message);
                }   
                }
          }
     }

Но я знал, что глубина ответов на комментарии была на 3 уровня ниже.Как я могу сделать эту проверку цикла, чтобы увидеть, есть ли в массиве comment.replies содержимое и запустить цикл?Это может выглядеть примерно так, но это не правильно.

         var i:int=0;
          for each (var comment : CommentVO in _comments) {
              trace("TOP COMMENT" + comment.raw_message );

                      for each (var comment : CommentVO in comment.replies) {    
                     trace( i + "DEPTH COMMENT REPLY " + comment.raw_message );
                             if(comment.replies.length >1){
                             i++;
                        }
                      }

               }       

Надеюсь, я достаточно ясно ... Я бился головой об этом.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 24 марта 2012

Если я правильно понимаю, каждый комментарий может иметь от 0 до n ответов, которые также являются комментариями, которые могут содержать от 0 до n ответов и т. Д.

Поэтому вам нужна рекурсивная функция, которая вызывается для каждогокомментарий, независимо от его глубины относительно исходного сообщения, но отслеживает эту глубину.

Это должно выглядеть примерно так:

function findReplies ( comment:commentVO, depth:int = 0) : String {
    var output:String = formatComment (comment, depth);

    for each ( var reply : commentVO in comment.replies ) {
        output += findReplies ( reply, depth + 1);
    }

    return output;
}

Вам не нужно использовать счетчикпеременная;цикл for each будет выполняться только в том случае, если в массиве есть содержимое.Вы вызываете этот метод для комментария верхнего уровня и, если хотите, вы можете отслеживать все дерево сразу, вместо вызова трассировки в теле функции, например:

trace ( findReplies (topComment) );

Реализация formatComment()чтобы вывод был хорошо отформатирован.Например:

function formatComment ( comment:commentVO, depth:int ) : String {
    var output:String = depth > 0 ? "  " : "- ";

    var i:int = -1;
    while (++i < depth) output+= "  ";

    output += "Comment ";
    if ( depth > 0 ) output += "reply ";

    output += "at depth "+depth+":";
    output += comment.raw_message;
    output += "\n";

    return output;
}

вернет:

- Comment at depth 0:  {text}
    Comment reply at depth 1: {text}
      Comment reply at depth 2: {text}
    Comment reply at depth 1: {text}
    Comment reply at depth 1: {text}
    Comment reply at depth 1: {text}
      Comment reply at depth 2: {text}
        Comment reply at depth 3: {text}
        Comment reply at depth 3: {text}
0 голосов
/ 24 марта 2012

Вот ответ всем, кому это нужно !!!и поверьте мне, что вы сделаете это, если ваше дерево данных генерируется динамически, и вы не знаете, насколько глубоки будут отношения между ребенком и родителем.

   for each (var comment : CommentVO in _comments) {
              trace("TOP COMMENT" + comment.raw_message );

                     listReplies(comment.replies);

                     }
               }    


  private function listReplies(replies:Array):void{
             for each (var comment : CommentVO in replies) {          

                            trace(  " >>>>>> " + comment.raw_message);

                 if (replies.length > 0 ){ 
                                 listReplies( comment.replies); 
                                }

               }

        }
0 голосов
/ 24 марта 2012

Я написал тестовый пример, который вы можете использовать для рекурсивного преобразования кода:

var childStructure:Array = [2,3,1,0];

function test(depth) {

    for(var i = 0; i < childStructure[depth]; i++) {

        test(depth+1);      
    }

    trace("DEPTH " + (depth + 1) + " COMMENT REPLY " ); 
}

test(0);  

Выше приведен вывод в консоли, похожий на:

DEPTH 4 COMMENT REPLY 
DEPTH 3 COMMENT REPLY 
DEPTH 4 COMMENT REPLY 
DEPTH 3 COMMENT REPLY 
DEPTH 4 COMMENT REPLY 
DEPTH 3 COMMENT REPLY 
DEPTH 2 COMMENT REPLY 
DEPTH 4 COMMENT REPLY 
DEPTH 3 COMMENT REPLY 
DEPTH 4 COMMENT REPLY 
DEPTH 3 COMMENT REPLY 
DEPTH 4 COMMENT REPLY 
DEPTH 3 COMMENT REPLY 
DEPTH 2 COMMENT REPLY 
DEPTH 1 COMMENT REPLY 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...