ColdFusion перебирает [только часть] списка - PullRequest
1 голос
/ 11 августа 2011

Действительно трудно найти способ перебрать только часть (или, может быть, половину) списка холодного синтеза.У меня есть оператор if, настроенный для проверки длины списка, и если он превышает 30 ... Я хочу разделить список на первые 30 и остальные?Не уверен, что это лучшее решение.Мне действительно не нужно много подробностей, я уверен, что могу сам разобраться в этом, я больше смотрю, чтобы просто указывать в правильном направлении ...

Ответы [ 4 ]

4 голосов
/ 11 августа 2011

Вместо циклического перемещения по списку, переходите от 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>
3 голосов
/ 11 августа 2011

Вы можете использовать базовые функции 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>
0 голосов
/ 19 декабря 2012

В CF10 или Railo 4 вы можете использовать функции first () и rest () из Underscore.cfc для разделения вашего списка: 1007 *

_ = new Underscore();

myArray = listToArray(myList);

firstThirty = _.first(myArray, 30);
remaining = _.rest(myArray, 31);

_.first() и _.rest() оба возвращают новые массивы на основе переданного в них индекса. Методы просто делегируют нативную функцию arraySlice(), но они могут помочь вам написать более выразительный код.

Примечание: я написал Underscore.cfc

0 голосов
/ 11 августа 2011

это действительно зависит от того, что вы пытаетесь достичь, как будут использоваться 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...