【问题标题】:ColdFusion looping through [only part] of a listColdFusion 循环遍历列表的 [仅部分]
【发布时间】:2011-08-10 22:01:55
【问题描述】:

真的很难找到一种方法来循环遍历coldfusion列表的一部分(或者可能是一半?)。我设置了一个 if 语句来检查列表的长度,如果它超过 30... 我想将列表分成前 30 个和其余部分?不确定这是否是最好的解决方案。我真的不需要太多细节我敢肯定我自己可以弄清楚我更多的是为了指出正确的方向......

【问题讨论】:

  • 回复:“不确定这是否是最好的解决方案..” - 循环或拆分列表?
  • 我指的是拆分列表。
  • 您能否详细说明最终目标或提出一个新问题?
  • 我正在使用命令行中的 IECapt 从大约八个不同精心制作的站点的站点地图中提取屏幕截图。如果我通过调整“延迟”属性来抓取大约 30 个屏幕截图,它工作得很好。但是,每个站点内部都有大约 150 个不同的屏幕(8 个不同的站点)。我尝试在我的代码中加入“cfthread”标签以加快进程,但仍然无法在一次完整运行中完成任务。我的目标是在一个组件中拥有可重用的功能,以便一次在任意数量的站点上执行操作,其中包含任意数量的屏幕截图。
  • 你所说的“一个完整的运行”是什么意思?旁注:我认为您应该将此作为一个单独的问题提出,以获得更广泛的受众的更多曝光/反馈。

标签: list loops coldfusion


【解决方案1】:

不是在列表上循环,而是从 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>

【讨论】:

    【解决方案2】:

    您可以使用底层的 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 个项目。您现在可以轻松地循环遍历 Array 的元素。

    为了更清楚,这里有一个例子:

    <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>
    

    【讨论】:

    • 非常感谢。我对 Java 更加熟悉,并且刚刚开始使用 ColdFusion,这对我来说是最有意义的。如果我已经知道了 subList() 方法,我希望我能为您省去麻烦...
    【解决方案3】:

    这真的取决于你想要完成什么,如何使用这两组分离的数据以及你在列表中拥有的数据类型......数据真的需要分离吗?你能不能:

    <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>
    

    -肖恩

    【讨论】:

    • 是的,或者我可以使用 - &lt;cfloop from="listGetAt(myList,#start#)" to="listGetAt(myList,#end#)" index="i"&gt; &lt;/cfloop&gt;
    【解决方案4】:

    在 CF10 或 Railo 4 中,您可以使用 Underscore.cfc 中的 first()rest() 函数来拆分您的列表:

    _ = new Underscore();
    
    myArray = listToArray(myList);
    
    firstThirty = _.first(myArray, 30);
    remaining = _.rest(myArray, 31);
    

    _.first()_.rest() 都根据传入的索引返回新数组。这些方法只是委托给原生 arraySlice() 函数,但它们可以帮助您编写更具表现力的代码。

    注意:我写的是 Underscore.cfc

    【讨论】:

      猜你喜欢
      • 2014-09-26
      • 2016-02-01
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      相关资源
      最近更新 更多