Давайте подумаем об этом по-другому. Если мы перепишем их в 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>');
}
Если мы рассмотрим сигнатуру атрибута cfloop так же, как использование for(counter;condition;incrementor)
и for(valuekey in object)
, мы увидим, что это примерно одно и то же.
Вы можете выбрать, как перебирать ваш объект (массив), но вы не можете выбрать версию только для значения, и текущие итераторы отслеживают индекс для вас.
Поэтому, если вам нужно отслеживать ваш предыдущий/следующий индекс, вам нужно выбрать метод итератора, который позволяет индекс (даже если это делается вручную).
NB: для массива вы, вероятно, можете смешивать/сопоставлять значение ключа с ручным итератором (стиль for(k in obj)
), но когда используется структура, это фактическое имя KEY возвращается в 'k'. Не значение итерируемого массива. Это соответствует сигнатуре атрибута 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)
Что, конечно, является просто поиском индекса по значению, при условии, что значение уникально. Использование одного из методов цикла, который использует индекс, кажется более безопасным, чем пытаться выяснить, где вы находитесь постфактум.
person
williambq
schedule
14.06.2013
m
наi
. Имейте в виду, чтоi-1
может дать0
(индекс CF основан на 1, 0 выходит за пределы), поэтому проверьте пограничный случай. - person Henry   schedule 13.06.2013cfloop array = ""
для основных циклов. есть ли причина, по которой вы пытаетесь избежать индексного цикла? - person Travis   schedule 13.06.2013myArray
является 2D или более и зацикливается на массиве, а не на счетчике для ссылки на элементы<cfset cnt=1><cfloop index="idxTempArray" array="#my2DArray">#idxTempArray[2]#...<cfif cnt++ gt 5>...do after something 5th element...</cfif></cfloop>
. (Обратите внимание, чтоcnt++
работает только в CF11 и более поздних версиях, это и сравнение, и затем увеличение, но при этом сохраняется строка кода, предназначенная только для увеличения. До CF11,<cfset cnt=cnt+1><cfif cnt gt 5>...
) - person gordon   schedule 28.04.2020