Coldfusion 缩短编号,例如,1,2,5,6,7变为1,2,5-7

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

我的任务是通过将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, 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:)谢谢大家。我不知道代码审查这也假设传入的数组已排序,并且没有重复。比我的更干净。我花了太多的时间在我的解决方案上,这是可行的,但比你的要复杂得多。美好的