真的很难找到一种方法来循环只有部分(或半个可能?)的冷冻列表。我有一个if语句设置来检查列表的长度,如果它超过30 ...我想将列表拆分为前30个和其余的?不确定这是否是最好的解决方案。我真的不需要太多细节我敢肯定我能自己解决这个问题我更倾向于指向正确的方向......
答案 0 :(得分:4)
不是循环遍历列表,而是从1循环到数字,并在循环中使用listGetAt()。对于列表的其余部分,只需从#myvar + 1#循环到#listLen#。
<cfoutput>
<cfloop from="1" to="#myVar#" index="idx">
#listGetAt( myList, idx )#<br />
</cfloop>
</cfoutput>
当然,这不是最有效的方法。如果遇到性能问题,可能希望通过listToArray()将列表转换为数组,然后执行:
<cfset myArray = listToArray( myList ) />
<cfoutput>
<cfloop from="1" to="#myVar#" index="idx">
#myArray[ idx ]#<br />
</cfloop>
</cfoutput>
答案 1 :(得分:3)
您可以使用底层的java函数。
<cfscript>
testList = "1,2,3,4,5,6,7,8,9,10,...,43,44";
listAsArray = listToArray(testList);
testChunk = listAsArray.subList(0,30);
</cfscript>
将为您提供一个数组“testChunk”,其中包含列表中的前30个项目。您现在可以轻松地遍历数组的元素。
为了更清楚,这是一个例子:
<cfscript>
testList = "";
maxChunkLength = 30;
for (i=1;i lte 100; i=i+1){
testList = listAppend(testList, i);
}
numOfChunks = ceiling(listLen(testList)/maxChunkLength);
listAsArray = listToArray(testList);
numOfItems = arraylen(listAsArray);
for (k=1;k lte numOfChunks; k=k+1){
startItem = (k - 1) * maxChunkLength;
endItem = startItem + maxChunkLength;
if (endItem gt numOfItems){
endItem = numOfItems;
}
writeOutput(listAsArray.subList(startItem, endItem).toString() & "<br />");
}
</cfscript>
答案 2 :(得分:0)
这实际上取决于您要完成的工作,如何使用2个独立的数据集以及列表中的数据类型......数据是否真的需要分开?你可以这样说:
<cfloop from="31" to="#listLen(myList)#" index="i">
#listGetAt(myList, i)#
</cfloop>
如果你不需要采取分成2个列表或数组的额外步骤,请保存自己的一些编码和放大器。执行时间
此外 - 如果您的起点发生变化,您可以随时:
<cfloop from="#start#" to="#listLen(myList)#" index="i">
#listGetAt(myList, i)#
</cfloop>
-Sean
答案 3 :(得分:0)
在CF10或Railo 4中,您可以使用first()中的rest()和Underscore.cfc功能拆分列表:
_ = new Underscore();
myArray = listToArray(myList);
firstThirty = _.first(myArray, 30);
remaining = _.rest(myArray, 31);
_.first()
和_.rest()
都会根据传入其中的索引返回新数组。这些方法只是委托给本地arraySlice()
函数,但它们可以帮助您编写更具表现力的代码。
注意:我写了Underscore.cfc