2

我有很多结构,我正在使用 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' ),
4

1 回答 1

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除了 John 之外的所有值,他是2.0

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

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

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

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

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

于 2012-10-15T17:30:06.633 回答