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
будет моим стандартом.