【问题标题】:coldfusion StructFindValue not working冷融合 StructFindValue 不起作用
【发布时间】: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 的键值起作用。它不适用于23(或 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


【解决方案1】:

这里的问题似乎是 CF 如何存储/显示/比较值。

下面是问题的简单演示:

<cfset Data = 
    { Bob  : 2
    , Joe  : 1+1
    , Jane : "2"
    , John : 2.0
    , Alex : 4/2
    } />

<cfdump var=#Data# />

<cfdump var=#StructFindValue(Data,2,"all")# />
<cfdump var=#StructFindValue(Data,"2","all")# />
<cfdump var=#StructFindValue(Data,2.0,"all")# />


第一个转储将所有值显示为2,除了2.0 的约翰

但是,前两个 StructFindValue 调用都只返回 Bob,Jane

第三个 StructFindValue 调用返回 Joe,John, Alex

这基本上表明 CF 的 StructFindValue 进行了非常粗略的比较来检查相等性,并且在处理数字时基本上是不可信的。

(Railo 不存在此问题,它可能使用与执行 EQ 测试时完全相同的比较,相应地强制类型。仅在 CF10,0,0,282462 上测试。)

要解决您的问题,您似乎需要手动遍历结构并自己复制 StructFindValue 的行为。

【讨论】:

  • 是的,CF10 似乎对简单值执行 string 比较.. 呃。因此,除了字符串(即数字、日期等)之外的所有内容都可能不可靠
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多