【发布时间】:2012-10-16 08:05:52
【问题描述】:
我有很多结构,我正在使用 StructFindValue() 来确定某个键是否多次出现。
我得到了为“singles”返回的预期数组,但是我得到了一个用于“doubles”和“triples”的空数组 - 此代码实际上位于不同的代码段内,-my 本身就是一个结构......
如果我尝试任何一行“x= StructFindValue(y, 3, 'all');”在一个独立的模板中 - CF 找到 '2' 和 '3' 值就好了 - 我得到了一个包含数据的数组 - 但在上面的代码中 - 只有 '1' 的值返回任何东西......
我很困惑。
更新
好的,响应更多信息的请求,我的服务器详细信息是:
Version ColdFusion 10,282462
Edition Developer
Operating System Windows XP
Java Version 1.6.0_29
OS Version 5.1
Update Level /C:/ColdFusion10/cfusion/lib/updates/chf10000002.jar
Adobe Driver Version 4.1 (Build 0001)
从下面的代码示例中可以看出,我的数组有几个不同的名称,具有不同的重复性质。我想知道哪些值重复了指定的次数。如上所述,structkeyFind() 仅对1 的键值起作用。它不适用于2、3(或 4 或 5 等,为简洁起见,此处不包括)的键值。
<cfscript>
_myArry = listToArray('bob,bob,bob,joe,jane,jane,john,john,john,alex,greg');
_myStats = getDataStats( _myArry );
writeDump( _myStats );
</cfscript>
<cffunction name="getDataStats">
<cfargument name="data" required="yes" type="array" >
<cfscript>
var _hv = {};
// default some values
_hv.vals = {};
_hv.threes = false;
_hv.twos = false;
_hv.ones =false;
// loop the data put it into separate containers
for ( var i=1; i LTE arrayLen( arguments.data ); i++ ) {
switch ( lcase( arguments.data[i] ) ) {
case 'bob': // bob
if ( structKeyExists( _hv.vals, 'bob' ) ) { _hv.vals.bob = _hv.vals.bob + 1; }
else { _hv.vals.bob = 1; }
break;
case 'joe': // joe
if ( structKeyExists( _hv.vals, 'joe' ) ) { _hv.vals.joe = _hv.vals.joe + 1; }
else { _hv.vals.joe = 1; }
break;
case 'jane': // jane
if ( structKeyExists( _hv.vals, 'jane' ) ) { _hv.vals.jane = _hv.vals.jane + 1; }
else { _hv.vals.jane = 1; }
break;
case 'john': // john
if ( structKeyExists( _hv.vals, 'john' ) ) { _hv.vals.john = _hv.vals.john + 1; }
else { _hv.vals.john = 1; }
break;
case 'alex': // alex
if ( structKeyExists( _hv.vals, 'alex' ) ) { _hv.vals.alex = _hv.vals.alex + 1; }
else { _hv.vals.alex = 1; }
break;
case 'greg': // greg
if ( structKeyExists( _hv.vals, 'greg' ) ) { _hv.vals.greg = _hv.vals.greg + 1; }
else { _hv.vals.greg = 1; }
break;
}
}
// give me a return struct for testing so i can 'see' where I'm at
var _thisReturn = {
'threes' = StructFindValue( _hv.vals, 3, 'all' ),
'twos' = StructFindValue( _hv.vals, 2, 'all' ),
'ones' = StructFindValue( _hv.vals, 1, 'all' ),
'values' = arguments.data
};
</cfscript>
<cfreturn _thisReturn />
</cffunction>
为了尝试“转换”这些值,我尝试了这些变体中的每一个。然而,结果与原始结果没有变化。
'ones' = StructFindValue( _hv.vals, '1', 'all' ),
'twos' = StructFindValue( _hv.vals, '2', 'all' ),
'threes' = StructFindValue( _hv.vals, '3', 'all' ),
然后
'ones' = StructFindValue( _hv.vals, val( 1 ), 'all' ),
'twos' = StructFindValue( _hv.vals, val( 2 ), 'all' ),
'threes' = StructFindValue( _hv.vals, val( 3 ), 'all' ),
【问题讨论】:
-
如果那个 exact 代码自己工作,那么周围代码中的某些东西就会有所不同。这是我们需要看到的部分。发布一个SSCCE,它会产生“坏”的结果,即空数组。
-
什么引擎和CF版本?我刚刚在 CF9 上运行了这个,我得到了所有 3 个测试的预期值。编辑:正如 Leigh 所说,我们无法从上面的代码示例中为您提供帮助。
-
在本地运行 CF10...想提供周围的代码-但它很广泛-给我一些时间来精简它的本质...令人困惑的是“1”给了我一个回报,“2”的值没有——即使我可以在 structFindValue() 之前直接转储结构并且它显然具有“2”的值。所以我完全同意这可能是代码中的一些东西-但是为什么“1”的值起作用???给我一点时间来隔离和减少代码。
-
我在 CF10、CF9、Railo 4.0.0.13 和 OpenBD 2.0.2 上运行过这个。它在所有这些上运行良好。所以无论你的问题是什么,都不是那个代码。还请提供您正在运行的确切 CF 版本。您能否确认,如果您运行该 exact 代码(除了修复丢失的分号,甚至无法编译),您不会得到预期的结果吗?
-
记住结构是通过引用传递的,也许你正在修改结构,或者在函数定义中没有正确
var'd 它。
标签: coldfusion struct