inv*_*ear 3 coldfusion coldfusion-6 coldfusion-7
在8之前的ColdFusion版本中,如果结构中有任何组件,则复制函数会抛出错误.在8及以后它将工作,但复制组件时存在问题.
所以,我需要的是一种创建忽略组件的结构的深层副本的方法.出于我的目的,它是用于调试的,我需要在代码中的特定点处获得变量范围的快照,因此效率并不重要,因为这将永远不会使其脱离开发环境.目前使用CF 7,如果只解决这个问题,我会采取8个优惠,但我不控制升级:(
当你开始杀死脑细胞时,我对一个递归函数进行了尝试;)它排除了组件和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)
| 归档时间: |
|
| 查看次数: |
1043 次 |
| 最近记录: |