名前やクラス名からオブジェクトを列挙する再帰的関数

by meat18
getChildByNameは直子しか取得できないのでついカッとなって・・・。
♥0 | Line 68 | Modified 2010-03-27 23:59:50 | MIT License
play

ActionScript3 source code

/**
 * Copyright meat18 ( http://wonderfl.net/user/meat18 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/jrwX
 */

/*
getChildByNameは直子しか取得できないのでついカッとなって・・・。
*/
package {
	import flash.display.*;
	import flash.text.TextField;
	public class FlashTest extends Sprite {
		private const source:String = "abcde";
		private var tf:TextField = new TextField;
		private var str:String = "";
		public function FlashTest() {
			//適当にSprite生成 ランダムに命名
			for(var i:int = 0;i < 10;i++){
				var sp:Sprite = Sprite(addChild(new Sprite));
				sp.name = source.charAt(Math.random()*source.length);
				var sp2:Sprite = Sprite(sp.addChild(new Sprite));
				sp2.name = source.charAt(Math.random()*source.length);
			}
			str = source.charAt(Math.random()*source.length);
			var ar:Array = getObjectsByName(str);
			tf.autoSize = "left";
			if(ar.length != 0){
				str = "名前が" + str + "のオブジェクトは・・・\n";
				ar.forEach(function myFunc(it:*, ind:int, arr:Array):void {
					str += it.parent.name + "の子オブジェクト。\n";
				});
			}else{
				str += "という名前のオブジェクトはありません";
			}
			tf.text = str;
			addChild(tf);
		}
		
		//オブジェクト名から表示リスト上の全オブジェクトを配列で取得する関数
		private function getObjectsByName(targetName:String,rootObj:DisplayObjectContainer = null):Array{
			rootObj ||= this.stage;
			var ar:Array = [];
			getChildrenByName(targetName,rootObj,ar);
			function getChildrenByName(targetName:String,rootObj:DisplayObjectContainer,arr:Array):void{
				var nc:int = rootObj.numChildren;
				for(var i:int = 0;i < nc;i++){
					var ch:* = rootObj.getChildAt(i);
					if("name" in ch){
						if(ch.name == targetName){
							arr.push(ch);
						}
					}
					if(ch is DisplayObjectContainer){
						getChildrenByName(targetName,DisplayObjectContainer(ch),arr);
					} 
				}
			}
			return ar;
		}
		
		//ついでに、クラス名から表示リスト上の全オブジェクトを配列で取得する関数
		private function getObjectsByClassname(classname:Class,rootObj:DisplayObjectContainer = null):Array{
			rootObj ||= this.stage;
			var ar:Array = [];
			getChildrenByclassname(classname,rootObj,ar);
			function getChildrenByclassname(classname:Class,rootObj:DisplayObjectContainer,arr:Array):void{
				var nc:int = rootObj.numChildren;
				for(var i:int = 0;i < nc;i++){
					var ch:* = rootObj.getChildAt(i);
					if(ch is classname){
						arr.push(ch);
					}
					if(ch is DisplayObjectContainer){
						getChildrenByclassname(classname,DisplayObjectContainer(ch),arr);
					} 
				}
			}
			return ar;
		}
	}
}