用旧的词典构建一个新的词典?帮助字典递归

时间:2010-08-31 06:08:49

标签: actionscript-3 dictionary recursion

我正在使用大量的分层分类术语,其中每个术语(“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()无效。请帮忙!

1 个答案:

答案 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循环只会为您提供顶级子级。它不会以递归方式遍历整个树。