StructKeyList()
将为我提供以逗号分隔的struct key列表。现在,我需要获取以逗号分隔的结构值。现在,这就是我为获得价值所做的事情
<cfloop collection="#form#" item="key" >
#form[key]#,
</cfloop>
如何从结构中获取无循环值列表?预先感谢。
答案 0 :(得分:3)
我解决了你的问题。据我所知,不可能在单个函数中获取结构值列表。我们必须循环键并获取每个键的值。但是我可以提供一种解决方案,以逗号分隔来获取结构值。
<cfset strNew = {"a":"10","b":20,"c":30}>
strNew是我的示例结构。
<cfset myList = ''>
<cfloop collection="#strNew#" item="key" >
<cfset myList = listappend(myList,structfind(strNew,key))>
</cfloop>
<cfdump var="#myList#" />
在这里,我遍历了结构键,找到了特定键的值,并使用listappend和structfind函数将其附加到列表中。
因此您无需像#structure [key]#那样放,在逗号(,)的末尾也添加了key的最后一个值。例如,您的代码应返回10、20、30。
所以您不需要那样做。使用structfind和listappend也可以避免逗号结尾。希望对您有帮助。
答案 1 :(得分:2)
由于使用的是CF2016,因此,如果要避免循环,可以始终使用reduce()
之类的高阶函数之一。
fields = formScope.reduce( function(result, key, value) {
result.append(value) ;
return result ;
}, [] ) ;
这将获取form
范围(formscope
)的结构,并使用reduce()
逐步遍历并将其取为单个值(将结构值转换为一个数组)。然后,将返回的数组放入列表中。
writeDump( fields.toList() )
我的完整测试代码在https://trycf.com/gist/f00cc62cd4631f44070faf8008e6788f/acf2016?theme=monokai
<cfscript>
formScope = {
empty1 : "" ,
fieldl : "text1" ,
field2 : "text2" ,
empty2 : "" ,
field3 : "text3" ,
field4 : "text4" ,
empty3 : ""
} ;
fields = formScope?.reduce( function(result, key, value) {
len(value) ? result.append(value) : "" ;
return result ;
}, [] ) ;
writeDump( fields?.toList() ?: "Form doesn't exist." ) ;
</cfscript>
给我们:text2,text3,text4,text1
。
formScope
是我将传递给此页面的表单字段的模拟版本。我主要使用StructReduce
,ArrayAppend
和ArrayToList
的成员函数版本。我还使用initialVal
可选参数将归约的result
值初始化为数组。我在数组中插入一行之前检查该值是否具有长度(如果需要,也可以修整),以便从最终列表中删除空元素。我还使用安全导航运算符(?.
)进行一些基本验证,以确保元素存在(例如,如果表单未通过或归约产生无效结果),并使其更具抗错误性。
注意:我相信可以引入ArrayReduce
来与CF11兼容。
https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-s/structreduce.html http://ryanguill.com/functional/higher-order-functions/2016/05/18/higher-order-functions.html https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-a-b/arraytolist.html