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

eda*_*dam 3 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

---->
Run Code Online (Sandbox Code Playgroud)

现在,请您告诉我如何在不设置索引并在循环内递增的情况下实现相同的结果?如果你仔细注意,我不得不再写两个cfset标签和一个带有昂贵代码的cfif标签,以避免在集合末尾出现逗号(,)!

Bra*_*ood 7

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

设置数据

myStruct = { 'age'=24, 'haar'='Blondes haar', 'sex'='female', 'ort'='Hanau' };
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

http://cfdocs.org/structreduce

  • 更不用说如果我看到那些代码我会删除它并使其可读. (2认同)