让我们以不同的方式思考这个问题。如果我们出于说明目的在 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)
当然,这只是按值查找索引,假设值是唯一的。使用其中一种使用索引的循环方法似乎更安全,而不是试图在事后弄清楚你在哪里。