如何深入复制(克隆)结构而忽略组件

inv*_*ear 3 coldfusion coldfusion-6 coldfusion-7

在8之前的ColdFusion版本中,如果结构中有任何组件,则复制函数会抛出错误.在8及以后它将工作,但复制组件时存在问题.

所以,我需要的是一种创建忽略组件的结构的深层副本的方法.出于我的目的,它是用于调试的,我需要在代码中的特定点处获得变量范围的快照,因此效率并不重要,因为这将永远不会使其脱离开发环境.目前使用CF 7,如果只解决这个问题,我会采取8个优惠,但我不控制升级:(

Lei*_*igh 5

当你开始杀死脑细胞时,我对一个递归函数进行了尝试;)它排除了组件和java/com对象.MX7都不能复制.我将函数放入组件中以避免篡改variables范围.然后将实例存储在request范围中.

它没有经过严格的测试.所以我相信还有改进的余地.

用法

<cfset request.util = createObject("component", "Util")>
<cfset request.copy = request.util.duplicateStructMinusObjects(variables)>
<cfdump var="#request.copy#">
Run Code Online (Sandbox Code Playgroud)

Util.cfc

<cfcomponent>
    <cfscript>
            function duplicateArrayMinusObjects(input) {
                    var x      = "";
                    var value  = "";
                    var output = arrayNew(1);

                    for (x = 1; x lte arrayLen(arguments.input); x = x + 1) {
                            value = arguments.input[x];

                            // note components are considered structures
                            if (IsStruct(value) and not IsObject(value)) {
                                    arrayAppend(output, duplicateStructMinusObjects(value));
                            }
                            else if (IsArray(value)) {
                                    arrayAppend(output, duplicateArrayMinusObjects(value));                
                            }
                            else if (not IsObject(value)){        
                                    arrayAppend(output, duplicate(value));
                            }
                    }        
                    return output;
            }

            function duplicateStructMinusObjects(input) {
                    var key    = "";
                    var value  = "";
                    var output = structNew();

                    for (key in arguments.input) {
                            value = arguments.input[key];

                            // note components are considered structures
                            if (IsStruct(value) and not IsObject(value)) {
                                    output[key] = duplicateStructMinusObjects(value);
                            }
                            else if (IsArray(value)) {
                                    output[key] = duplicateArrayMinusObjects(value);
                            }
                            else if (not IsObject(value)){        
                                    output[key] = duplicate(value);
                            }
                    }

                    return output;
            }
    </cfscript>
</cfcomponent> 
Run Code Online (Sandbox Code Playgroud)