Coldfusion 缩短编号,例如,1,2,5,6,7变为1,2,5-7
我的任务是通过将3或更多的内部序列替换为内部数字的破折号来缩短数字序列(例如,3,5,6,7,8,10将是3,5-8,10)我将以下函数和一些演示输出放在一起。它假定这些数字位于有序、不重复的数组中。(CF list函数有助于达到这一点。)有没有更优雅的方法Coldfusion 缩短编号,例如,1,2,5,6,7变为1,2,5-7,coldfusion,pagination,sequencing,Coldfusion,Pagination,Sequencing,我的任务是通过将3或更多的内部序列替换为内部数字的破折号来缩短数字序列(例如,3,5,6,7,8,10将是3,5-8,10)我将以下函数和一些演示输出放在一起。它假定这些数字位于有序、不重复的数组中。(CF list函数有助于达到这一点。)有没有更优雅的方法 <cffunction name="fNumSeries" output="1" hint="parses array of numbers for display: 1|2|3|6|7|9|10|11|12 would be 1-3
<cffunction name="fNumSeries" output="1" hint="parses array of numbers for display: 1|2|3|6|7|9|10|11|12 would be 1-3, 6, 7, 9-12 ">
<cfargument name="raNums" required="1" type="array">
<cfset raLen=arraylen(raNums)>
<cfif raLen eq 0><CFRETURN "">
<cfelseif raLen eq 1><CFRETURN raNums[1]>
<cfelseif raLen eq 2><CFRETURN raNums[1] & "," & raNums[2]>
</cfif>
<cfset numSeries="">
<cfset numHold=raNums[1]>
<cfset seqHold=raNums[1]>
<cfset numSeries=raNums[1]><!--- raNums[1]always output the first number --->
<cfloop from="1" to="#raLen#" index="idxItem">
<cfif idxItem gt 1><!--- wait for 2nd element to decide output --->
<cfif numHold+1 neq raNums[idxItem]><!--- reason to output and seqHold+1 neq numHold--->
<cfif seqHold eq numHold>
<cfset numSeries=numSeries & ",#raNums[idxItem]#">
<cfelse>
<cfif seqHold+1 eq numHold><cfset numSeries=numSeries & ","><!--- and numHold+1 neq raNums[1] and seqHold+1 eq numHold --->
<cfelse><cfset numSeries=numSeries & "-">
</cfif>
<cfset numSeries=numSeries & "#numHold#,#raNums[idxItem]#">
</cfif>
<cfset seqHold=raNums[idxItem]>
</cfif>
</cfif>
<cfset numHold=raNums[idxItem]>
</cfloop>
<cfif seqHold neq numHold><!--- display the last element --->
<cfif seqHold+1 eq numHold or raLen eq 2><cfset numSeries=numSeries & ",">
<cfelse><cfset numSeries=numSeries & "-">
</cfif>
<cfset numSeries=numSeries & "#numHold#">
</cfif>
<CFRETURN numSeries>
</cffunction>
<cfset raRa=[
[2,12],
[2,3,12],
[2,4,12],
[2,3,4,12],
[2,8,9,11,12],
[2,9,11,12],
[2,3,8,10,11,12]
]>
<cfoutput>
<cfloop array="#raRa#" index="ra">
#arrayToList(ra)#<br />
#fNumSeries(ra)#<hr>
</cfloop>
</cfoutput>
#阵列列表(ra)#
#fNumSeries(ra)#
与上述内容非常相似,只是使用了列表
<cfscript>
a = listToArray('3,5,6,7,8,10,11,15,16,17,18');
writeOutput( fNumSeries(a) );
string function fNumSeries( array a) output="false" {
var tempList = '';
var outputList = '';
for ( var i in a ) {
if( listLen(tempList) == 0 ) {
// Nothing in the list
tempList = i;
} else if ( listLen(tempList) ) {
if ( listLast(tempList)+1 == i) {
// i is next in order from the previous list item. Just add to temp list.
tempList = listAppend(tempList, i);
} else if (listLen(tempList) >= 3) {
// current item is not the next item, and the tempList is more than 2 items long, so abbreviate and set templist to the current item.
outputList = listAppend(outputList, listFirst(tempList) & '-' & listLast(tempList));
tempList = i;
} else {
// tempList is less than 3 items long, just append to output and set tempList to the current item.
outputList = listAppend(outputList, tempList);
tempList = i;
}
}
}
// Clean up the remaining item(s) in tempList. If 3 or more, abbreviate, else just append to output.
outputList = listLen(tempList) >= 3 ? listAppend(outputList, listFirst(tempList) & '-' & listLast(tempList)) : listAppend(outputList, templist);
return outputList;
}
</cfscript>
a=列表阵列(“3,5,6,7,8,10,11,15,16,17,18”);
写输出(fNumSeries(a));
字符串函数fNumSeries(数组a)输出=“false”{
var templast='';
变量输出列表=“”;
对于(a中的var i){
if(listLen(templast)==0){
//清单上什么都没有
圣殿骑士=我;
}else if(listLen(圣殿骑士)){
if(listLast(templast)+1==i){
//我是上一个列表项的下一个。只需添加到临时列表。
tempList=listAppend(tempList,i);
}else if(listLen(圣殿骑士)>=3){
//当前项目不是下一个项目,并且tempList的长度超过2个项目,因此请缩写并将tempList设置为当前项目。
outputList=listAppend(outputList、listFirst(模板列表)和'-'和listLast(模板列表));
圣殿骑士=我;
}否则{
//tempList的长度少于3项,只需附加到输出并将tempList设置为当前项即可。
outputList=listAppend(outputList,tempList);
圣殿骑士=我;
}
}
}
//清理tempList中的剩余项。如果3个或更多,请缩写,否则只需附加到输出。
outputList=listLen(tempList)>=3?listAppend(outputList,listFirst(tempList)&'-'和listLast(tempList)):listAppend(outputList,tempList);
返回输出列表;
}
这些信息应该添加到您的问题中,而不是答案中。如果您有功能代码,并且想知道是否有“更好”的方法,您应该继续询问。如果您正在寻找有关代码的建议,最好发布一个新问题,而不是自我回答。另外,如果代码按预期工作,正如@FishBelowtheIce建议的那样,您可以尝试在代码审阅上发布。Schooled:)谢谢大家。我不知道代码审查这也假设传入的数组已排序,并且没有重复。比我的更干净。我花了太多的时间在我的解决方案上,这是可行的,但比你的要复杂得多。美好的