将嵌套的ArrayCollection元素转换为另一个类

时间:2011-02-01 11:36:23

标签: flex actionscript-3 actionscript recursion arraycollection

我有一个ArrayCollection,每个元素都是TreeNode类(我自己创建的一个自定义类)的一个实例,它有一个“children”属性,它是更多TreeNode元素的ArrayCollection。这样,我在ArrayCollection结构中有一个元素树:

tree = new ArrayCollection([
    [new TreeNode(param1, param2, new ArrayCollection([
        [new TreeNode(param1, param2, null)],
        [new TreeNode(param1, param2, new ArrayCollection([
            [new TreeNode(param1, param2, null)],
            [new TreeNode(param1, param2, new ArrayCollection([
                [new TreeNode(param1, param2, null)],
                [new TreeNode(param1, param2, null)]
            ]))],
            [new TreeNode(param1, param2, new ArrayCollection([
                [new TreeNode(param1, param2, null)],
                [new TreeNode(param1, param2, null)]
            ]))]
        ]))]
    ]))],
    [new TreeNode(param1, param2, null)]
]);

TreeNode构造函数有3个参数:前两个没关系,但第三个是children属性(一个ArrayCollection),如果TreeNode没有任何子节点,那么该参数必须设置为null。 / p>

我编写了以下函数来递归地解析“树”结构:

private function parse(obj:Object):void {
    for (var i:int = 0; i < obj.length; i++) {
        if (obj[i] is TreeNode) {
            if (obj[i].children != null) {
                parse(obj[i].children);
            }
        } else {
            parse(obj[i]);
        }
    }
}
parse(tree);

但我的问题是:我需要拥有与另一个类的实例相同的“树”结构(它不需要是同一个变量)。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

我做到了:

private function parse(obj:Object, ancestor:Node):void {
    for (var i:int = 0; i < obj.length; i++) {
        if (obj[i] is TreeNode) {

            var node:Node = new Node(obj[i].param1, obj[i].param2);
            node.ancestor = ancestor;

            if (ancestor != null) {
                ancestor.children.push(node);
            }

            if (obj[i].children != null) {
                parse(obj[i].children, node);
            }

            obj[i] = node;
        } else {
            parse(obj[i], ancestor);
        }
    }
}
parse(tree, null);

这样,所有TreeNode都将转换为Nodes(Node是我制作的另一个自定义类)