我正在使用大量的分层分类术语,其中每个术语(“203”)在舞台上都有匹配的“term203”影片剪辑,并且无法获得递归函数来返回所有给定的术语的后代。
对于每个术语,都有一个主Dictionary()
个对象,其中包含以下嵌套组织:
{ [object Movie Clip] : { "tid":203, "parent":99, "name":"Culture", selected:false, "otherData":"etc" } }
... [object Movie Clip]
的实例名称为"term203"
。所有这些对象:subObjectArray项(“术语”)存储在主taxonomy:Dictionary()
对象中。
我一直试图制作一个递归函数(这本身已经超出了我的头脑),它获取了一个影片剪辑的click.target
并返回一个新的{{ 1}}与上述相同的嵌套组织中的所有子孙和孙子(等)的对象。
下面的代码跟踪了正确数量的递归循环,但返回的Dictionary()
对象只包含第一个运行的术语(只是所请求术语的直接子项)。
Dictionary()
我当然不认为自己是最有效的AS3程序员,因此我对其他配置持开放态度。但是,在尝试静态和嵌套数组之后,我宁愿继续使用var taxonomy:Dictionary = new Dictionary();
// ...Term info is loaded into taxonomy from a JSON-style text file)
// ...MOUSE_OVER event listeners are added to each
function revealChildren(hvr:MouseEvent):void {
trace("Spotlighting " + taxonomy[hvr.target].name + "'s children...");
for(var key:Object in getAllChildren(taxonomy[hvr.target].tid)) {
trace("Animating " + taxonomy[key].tid); // Traces only immediate children
var revealTween = new Tween(key, "alpha", Regular.easeInOut, key.alpha, 1, 1, true);
}
}
function getAllChildren(origin):Dictionary {
var children:Dictionary = new Dictionary();
for(var element:Object in taxonomy) {
if(taxonomy[element].parent == origin) {
var subSet = getAllChildren(taxonomy[element].tid);
children[element] = subSet; // *CAN'T ACCESS 'subSet' PROPERLY*
trace("Parent = " + origin);
trace("Matched! Adding " + taxonomy[element].tid + " as key and setting its value to " + subSet); // Traces correct amount of times, one for each descendent
}
else {
}
}
return children;
}
对象作为我的主池。
如上所述,只有直接的孩子最终在Dictionary()
功能中动画。这对我来说很奇怪,在revealChildren()
函数中,所有后代在输出窗口中按顺序(没有特定顺序)跟踪。
此外,我无法从getAllChildren()
对象中获取任何类型的名称或属性。这可能是问题所在。
我只测试了它的'两代',但似乎只有第一轮调用函数成功地将这些术语添加到新的subSet
对象并将其原封不动地返回给动画函数
太糟糕Dictionary()
无效。请帮忙!
答案 0 :(得分:2)
为简化起见,我添加了一个名为children
的输出参数。这是我们的函数将结果存储到的Dictionary
。它有一个默认值,因此您无需指定一个值。在这种情况下,它将为自己创建一个新实例。
function getAllChildren(origin:*, children:Dictionary = null):Dictionary {
if (children = null) children = new Dictionary();
for(var element:* in taxonomy) {
if(taxonomy[element].parent == origin) {
children[element] = taxonomy[element];
getAllChildren(taxonomy[element].tid, children);
}
}
return children;
}
当儿童被发现时,它会被完全复制:children[element] = taxonomy[element];
接下来,该函数以递归方式调用自身,为其提供与使用时相同的输出字典。
<小时/> 修改:
element
的孩子后发现了这一点:
children[element] = getAllChildren(taxonomy[element].tid);
您在此处children[element]
等于Dictionary
个对象。您创建的是树结构,将MovieClip
个对象映射到包含其子级的类似映射的Dictionary
个对象。在此结构上使用for in
循环只会为您提供顶级子级。它不会以递归方式遍历整个树。