2

私は多くの構造を持っています。私は StructFindValue() を使用して、キーが何度も発生するかどうかを判断しています。

「singles」に対して期待される配列が返されますが、「double」と「triples」に対しては空の配列が返されます - このコードは実際には別のコード セグメント内にあります -my はそれ自体が構造体です...

「x= StructFindValue( y, 3, 'all' );」のいずれかの行を試してみると、スタンドアロン テンプレート - CF は '2' と '3' の値を適切に検出します - データを含む配列を取得します - しかし、上記のコードでは - '1' の値のみが何かを返します...

よくわかりません。


アップデート

OK、詳細情報のリクエストに応じて、私のサーバーの詳細は次のとおりです。

    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()のキー値で IF (およびのみ) に機能します12, 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' ),
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

ただし、最初の 2 つの StructFindValue 呼び出しはどちらも , のみを返しBobますJane

3 番目の StructFindValue 呼び出しは、、、をJoe返しJohnますAlex

これは基本的に、CF の StructFindValue が等価性をチェックするための非常に大雑把な比較を行っていることを示しており、数値を扱う場合には基本的に信頼されるべきではありません。

(この問題は Railo には存在しません。Railo はおそらく、テストを実行するときとまったく同じ比較を使用し、それにEQ応じて型を強制します。CF10,0,0,282462 でのみテストされています。)

あなたの問題を解決するには、構造体を手動で歩き、StructFindValue の動作を自分で複製する必要があるようです。

于 2012-10-15T17:30:06.633 に答える