Как я могу поместить всех детей мувиклипа в массив? - PullRequest
0 голосов
/ 11 июля 2011

У меня есть контейнер MovieClip, и я хочу переместить все его дочерние элементы в массив. Я думаю о методе, который я использовал для удаления всех дочерних элементов контейнера, используя while и removechild в 0, но я думаю, что в этой ситуации он не будет работать. У кого-нибудь есть решение? спасибо за вашу помощь.

Ответы [ 2 ]

4 голосов
/ 11 июля 2011
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 ) );

ТА-ДА!kids теперь массив всех потомков 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
}

EDIT

Было отмечено, что этот цикл не оптимизирует 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 будет моим стандартом.

0 голосов
/ 11 июля 2011

Вы можете использовать комбинацию 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);
...