Flash AS3无重复的递归对象扫描?

Flash AS3无重复的递归对象扫描?,flash,apache-flex,actionscript-3,actionscript,recursion,Flash,Apache Flex,Actionscript 3,Actionscript,Recursion,而递归扫描通常用于扫描嵌套对象/数据。如果某些对象相互引用,它可以进行无限循环。那么,扫描所有项目的最有效方法是什么,既不会使计算机崩溃,也不会跳过指定的参数 下面是一个递归扫描程序的示例 /** * Triggers the scan function for each object given **/ function recursiveScanner( object:* , scanFunction:Function ):void { if( typeof(object) ==

而递归扫描通常用于扫描嵌套对象/数据。如果某些对象相互引用,它可以进行无限循环。那么,扫描所有项目的最有效方法是什么,既不会使计算机崩溃,也不会跳过指定的参数

下面是一个递归扫描程序的示例

/**
 * Triggers the scan function for each object given
 **/
function recursiveScanner( object:* , scanFunction:Function ):void {
    if( typeof(object) == 'object' ) {
        for( var key:String in object ) {
            recursiveScanner( object[key], scanFunction );
        }
    } else {
        scanFunction.call(this, object);
    }
}
但是,当传入以下内容时,会出现巨大的问题

//...
obj1.next = obj2;
//...
obj2.next = obj3;
//...
obj3.next = obj1;
//...
recursiveScanner(obj1, scanFuction);
这些对象将在一个永恒的循环中触发对彼此的扫描。有没有办法解决这个问题


我相信C/C++:每次scanFunction调用都会被添加到由扫描的“内存地址”组成的列表中,从而防止重复。这在AS3中可能吗?还有更简单的方法吗?

使用
字典
保存扫描对象的列表,如果以前扫描过,则忽略它们:

/**
 * Triggers the scan function for each object given
 **/
function recursiveScanner( object:* , scanFunction:Function, ignoreList:Dictonary = null ):void {
    // if we have no list, create one
    if (!ignoreList) ignoreList = new Dictionary();

    // if the item is in the list, we bail
    if (ignoreList[object]) return;

    // mark the item as scanned before recursing into it
    ignoreList[object] = true;

    if( typeof(object) == 'object' ) {
        for( var key:String in object ) {
            recursiveScanner( object[key], scanFunction, ignoreList );
        }
    } else {
        scanFunction.call(this, object);
    }
}

好的,接受@grapefrakt的答案,但这里有一些背景

用计算机科学的术语来说,这个问题相当于穿越一个可能包含循环的区域

基本上有两种简单的方法(即,不遵循启发式)进行遍历,或者


我将把它作为一个练习,以确定示例代码是BFS还是DFS。

深度优先:),这对于我的部署来说是最理想的,而不是宽度优先,因为我必须读取所有节点,在部署中不重复。因此,拥有BFS的FIFO是不必要的成本。Thx的良好阅读和参考反正=)不知道关于BFS在此之前:)将在未来有用Tyah。。。对象ID将在字典中用作属性。。。解决方案的Thx=)