有没有更好的方法来循环CFML中的集合(struct)?

时间:2016-09-07 11:22:17

标签: coldfusion coldfusion-9 cfml

请查看下面的代码块:

<cfset index = 0 />
<cfloop collection="#anotherPerson#" item="key" >
    <cfset index = index+1 />
    <cfoutput> 
         #key# : #anotherPerson[key]# 
         <cfif index lt ArrayLen(structKeyArray(anotherPerson))> , </cfif>
    </cfoutput>
</cfloop>

<!--- Result 

   age : 24 , haar : Blondes haar , sex : female , ort : Hanau

---->

现在请您告诉我如何在不设置索引并在循环内增加索引的情况下如何实现相同的结果?如果您仔细注意,我必须再编写两个 cfset 标记和一个 cfif 标记以及昂贵的代码,以避免出现逗号(,)收藏的结束!

3 个答案:

答案 0 :(得分:7)

好的,我告诉你两个答案。第一个将在ColdFusion 9上运行。由于其他人可能会找到此线程并使用Lucee Server或更新版本的Adobe ColdFusion,我将包括使用更高阶函数并在ACF 2016上运行的单线程。 #39;很多语法糖(比如成员函数)和你在CF9上缺少的函数式编程。这些答案使用脚本,因为操纵数据不适用于视图(使用标签/模板)。

设置数据

myStruct = { 'age'=24, 'haar'='Blondes haar', 'sex'='female', 'ort'='Hanau' };

CF9 compat ,将数据转换为数组并使用分隔符添加逗号

myArray = [];
for( key in myStruct ) {
    arrayAppend( myArray, key & ' : ' & myStruct[ key ] );
}
writeOutput( arrayToList( myArray, ', ' ) );

现代CFML。使用struct reduction闭合将每个键转换为聚合数组,然后将其转换为列表。

writeOutput( myStruct.reduce( function(r,k,v,s){ return r.append( k & ' : ' & s[ k ] );  }, [] ).toList( ', ' ) );

http://cfdocs.org/structreduce

答案 1 :(得分:2)

有些朋友提供了两种不同的解决方案。两者都高效而优雅!

解决方案1 ​​

<cfset isFirst = true />
<cfloop collection="#anotherPerson#" item="key" >
    <cfif isFirst>
        <cfset isFirst = false />
    <cfelse> 
        ,   
    </cfif> 
    <cfoutput> 
       #key# : #anotherPerson[key]# 
    </cfoutput>
</cfloop>

解决方案2

<cfset resultList = "" />
<cfloop collection="#anotherPerson#" item="key" >
    <cfset resultList = ListAppend(resultList, "#key# : #anotherPerson[key]#" ) />
</cfloop>

干杯!

答案 2 :(得分:0)

完成后只需修剪逗号,不需要跳过逻辑。

<cfset html = '' />
<cfloop collection="#anotherPerson#" item="key" >
    <cfset html &= "#key# : #anotherPerson[key]# , " />
</cfloop>
<cfset html = left(html,len(html)-3) />

<cfoutput>#html#</cfoutput>

可读,简单,有效。