在 CFML 中循环遍历 collection(结构)的任何更好的方法?
Any better way to loop through a collection (struct) in 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 标签,只是为了避免 逗号(,)结尾的collection!
有朋友提供了两种不同的解决方案。既高效又优雅!
解决方案 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>
干杯!
好的,我给你两个答案。第一个将在 ColdFusion 9 上 运行。由于其他人可能会发现此线程并正在使用 Lucee Server 或更新版本的 Adobe ColdFusion,因此我包括一个使用高阶函数和 运行s 在 ACF 2016 上。在 CF9 上你缺少很多语法糖(比如成员函数)和函数式编程。这些答案使用脚本,因为操作数据不是视图的东西(使用 tags/templating)。
设置数据
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。 使用结构归约闭包将每个键转换为聚合数组,然后将其转换为列表。
writeOutput( myStruct.reduce( function(r,k,v,s){ return r.append( k & ' : ' & s[ k ] ); }, [] ).toList( ', ' ) );
完成后只需 trim 逗号,无需跳过逻辑。
<cfset html = '' />
<cfloop collection="#anotherPerson#" item="key" >
<cfset html &= "#key# : #anotherPerson[key]# , " />
</cfloop>
<cfset html = left(html,len(html)-3) />
<cfoutput>#html#</cfoutput>
可读、简单、有效。
请看下面的代码块:
<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 标签,只是为了避免 逗号(,)结尾的collection!
有朋友提供了两种不同的解决方案。既高效又优雅!
解决方案 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>
干杯!
好的,我给你两个答案。第一个将在 ColdFusion 9 上 运行。由于其他人可能会发现此线程并正在使用 Lucee Server 或更新版本的 Adobe ColdFusion,因此我包括一个使用高阶函数和 运行s 在 ACF 2016 上。在 CF9 上你缺少很多语法糖(比如成员函数)和函数式编程。这些答案使用脚本,因为操作数据不是视图的东西(使用 tags/templating)。
设置数据
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。 使用结构归约闭包将每个键转换为聚合数组,然后将其转换为列表。
writeOutput( myStruct.reduce( function(r,k,v,s){ return r.append( k & ' : ' & s[ k ] ); }, [] ).toList( ', ' ) );
完成后只需 trim 逗号,无需跳过逻辑。
<cfset html = '' />
<cfloop collection="#anotherPerson#" item="key" >
<cfset html &= "#key# : #anotherPerson[key]# , " />
</cfloop>
<cfset html = left(html,len(html)-3) />
<cfoutput>#html#</cfoutput>
可读、简单、有效。