2

配列の値を含む複雑な計算を行うため、配列またはリストに対して cfloop を頻繁に使用します。ただし、配列/リストの特定のメンバーを参照する方法はないようです。通常のループを使用すると、簡単に実行できます。

<cfloop from = "1" to = "#ArrayLen(myarray)#" index = "i">
<cfset temp = "myarray[i]">
<cfif mystruct[temp] GT 5>
  ... do something
</cfif>
<cfif myarray[i] NEQ myarray[i-1]>
  ...do something
</cfif>
</cfloop>

しかし、myarray[i] に関連する計算は、i の値ではなく「i」で参照する必要がある場合、面倒な場合があります。

しかし、配列に対してループを使用すると、多くの場合、カウンターを追加する必要があります。

<cfset m = 0>
<cfloop array = #myarray# index = "value">
<cfset m = m + 1>
<cfif mystruct[value] GT 5>
 ... do something
</cfif> 
<cfif myarray[i] NEQ myarray[i-1]>
  ...do something
</cfif>
</cfloop>

cfloop 配列 = myarray コーディング内で myarray[i-1] を参照する方法を知っている人はいますか? これを調査したところ、 http://www.markdrew.co.uk/blog/post.cfm/cfloop-rantという暴言を見つけましたが、解決策はありません。

4

5 に答える 5

3

これをコメントとして始めましたが、すぐに長くなりすぎました。おっしゃる通りカウンターを使うことが多いです。ColdFusion がこれを処理する組み込みの方法はないと思います。現在の値を以前の値と比較することだけが心配な場合は、以前に次のようなことを行いました。

<cfset previousValue = "">
<cfloop array = #myarray# index = "value">
    <cfif mystruct[value] GT 5>
        <!--- do something --->
    </cfif> 
    <cfif value NEQ previousValue>
        <!--- do something --->
    </cfif>
    <cfset previousValue = value>
</cfloop>
于 2013-06-13T18:01:37.893 に答える
0

CF 10 または Railo 4 を使用している場合は、Underscore.cfc ライブラリのeach()を使用して、インデックスでループできます。

_ = new Underscore();

_.each(myArray, function (value, index) {
   // loop code here
});

ただし、ループで何を達成しようとしているかに応じて、map()reduce( )などのより表現力豊かな関数を使用することをお勧めします。

注:Underscore.cfcを書きました

于 2013-06-16T16:33:17.607 に答える
0

これを別の方法で考えてみましょう。説明のために cfscript でこれらを書き直すと、次のようになります。

  myArray=[ 'xyz', 'yyy', '232', 'uoiu', 'youneedthis', '2343'];
    writedump(myArray);
    myLongStringThing = '';

    // LOOP OVER AN INDEX AND MANUALLY PUSH YOUR ARRAY ALONG
    for ( i = 1; i <= myArray.size(); i++) {
      v = myArray[i];
      if(i < 5 && i > 1 && myArray[i] != myArray[i-1]   ){
        x = doSomethingComplicated(v);
        myArray[i] = x; // Your new computed value
      }

      if(i > 1 && v != myArray[i-1] ) {
        y = somethingElseCool(v);
        myLongStringThing &= y;
      }
    }

    writedump(myArray);
    writeoutput(myLongStringThing & '<br>');

    // LOOP THE VALUES IN THE STRUCT/ARRAY 
    i = 0;
    for (k in myArray) {
      i++;
      writeoutput('k:' & k & '<br>');
      writeoutput('a[i]:' & myArray[i] & '<br>');
    }

    function doSomethingComplicated(v) {
      Arguments.v &= 'you did it!';
      return Arguments.v;
}

    function somethingElseCool(v) {
      Arguments.v &= ';';
      return Arguments.v;
    }

    // LOOPING A STRUCT IS DIFFERENT
    myStruct = {'asdf' = 234234, 'sdfsd' = 9798, 'oiujlkj3' = 'kohjkjh'};
    for (k in myStruct) {
      writeoutput('kinstruct:' & k & '<br>');
      writeoutput('kinstruct:' & myStruct[k] & '<br>');
    }

for(counter;condition;incrementor)cfloop の属性シグネチャをvsの使用と同じと見なすと、for(valuekey in object)それらはほぼ同じものであることがわかります。

オブジェクト (配列) を反復処理する方法を選択できますが、値のみのバージョンを選択して、現在の反復子にインデックスを追跡させることはできません。

したがって、前/次のインデックスを追跡する必要がある場合は、インデックスを許可する反復子メソッドを選択する必要があります (手動で行う場合でも)。

注: 配列の場合、おそらくキー値と手動反復子 (for(k in obj)スタイル) を組み合わせることができますが、構造体が使用されている場合、'k' に返されるのは実際の KEY 名です。反復配列の値ではありません。これは、コレクション (例: 構造体) をループする cfloop 属性シグネチャと一致しています。

値とインデックス属性マーカーの両方を設定できるように cfloop を求めていると思います。そして、他の言語 (および方言) がこれを行う可能性があることは理解していますが、これまでのところ、CF では違います。

特殊なケースは、複合 if ステートメントで簡単に管理できます。

タグの if ステートメントでまったく同じ複合ロジックを使用して、エッジ ケースも考慮することができます。

size()の代わりに使用したことに気付いたかもしれませんArrayLen()。配列で使用できる Java 演算子がいくつかあります。ただし、私が知る限り、特定の状態の「カーソル」またはインデックスを提供するものはありません。

配列をもう少し掘り下げたい場合は、配列の Java バージョンを作成して、さらにいくつかのことを行うことができます。

myArray = CreateObject( "java", "java.util.ArrayList" );
writeDump(myArray);  // This will show you the java object, which needs to be 'inited' still.
myArray = myArray.init(); // It returns the array, it does not act on the orig obj.
// You can now access the vast majority of java methods (including the parent methods)
myArray.add('myFirstValue');
myArray.add('my2ndValue');
myArray.add('yetAnotherValue');
writeDump(myArray);// This will look like a regular array dump
// You can also apply regular CF functions to this array like arrayAppend().
x = myArray.get(1); // This is a java index, so it begins at 0 which is the 1st elem. 1 is 2nd, etc.
writeOuput('At java index 1 we have:' & x & '<br>');

それらのいくつかで遊ぶことができますが、私が知る限り、使用可能なカーソルまたはインデックスを返すものはありません。ただし、subList() や equals() など、便利なものがいくつかあります。

最終的に、手動インデックスを保持せずにインデックスを見つけたい場合は、次のようにします。

index = arrayFind(myArray, v)

もちろん、値が一意であると仮定すると、値によるインデックスのルックアップにすぎません。インデックスを使用するループ メソッドの 1 つを使用する方が、事後に自分がどこにいるかを把握しようとするよりも安全に思えます。

于 2013-06-14T00:50:29.643 に答える