Forms 与structValue的StructKeyList()等效

Forms 与structValue的StructKeyList()等效,forms,coldfusion,coldfusion-2016,Forms,Coldfusion,Coldfusion 2016,StructKeyList()将为我提供以逗号分隔的结构键列表。现在我需要用逗号分隔结构值。现在,这就是我为获得价值所做的 <cfloop collection="#form#" item="key" > #form[key]#, </cfloop> #格式[键]#, 如何在没有循环的情况下从struct获取值列表?提前谢谢。我仔细检查了你的问题。据我所知,不可能在单个函数中获得结构中的值列表。我们必须循环该键并获得每个键的值。但我可以给出一个解决方案来获取

StructKeyList()
将为我提供以逗号分隔的结构键列表。现在我需要用逗号分隔结构值。现在,这就是我为获得价值所做的

<cfloop collection="#form#" item="key" >
    #form[key]#,
</cfloop>

#格式[键]#,

如何在没有循环的情况下从struct获取值列表?提前谢谢。

我仔细检查了你的问题。据我所知,不可能在单个函数中获得结构中的值列表。我们必须循环该键并获得每个键的值。但我可以给出一个解决方案来获取以逗号分隔的结构值

<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函数将其附加到和列表中

因此,您不需要在逗号(,)的末尾添加类似于#结构[key]#的内容,它还添加了key的最后一个值。例如,您的代码应该返回10,20,30


所以你没必要这样做。使用structfind和listappend还可以避免逗号结尾。希望对你有帮助

由于您使用的是CF2016,如果您想避免循环,您可以始终使用一个高阶函数,如
reduce()

这将获取
窗体
作用域(
formscope
)的结构,并使用
reduce()
逐步遍历它,并将其分解为单个值(即转换为数组的结构值)。然后我们将返回的数组放入一个列表中

writeDump( fields.toList() )
我的完整测试代码在


formScope={
空1:“”,
fieldl:“text1”,
字段2:“文本2”,
清空2:“”,
字段3:“文本3”,
字段4:“文本4”,
空3:“
} ; 
fields=formScope?.reduce(函数(结果、键、值){
len(值)?result.append(值):“”;
返回结果;
}, [] ) ; 
WriteMap(字段?.toList()?:“表单不存在。”);
给我们:
text2、text3、text4、text1

formScope
是我的表单字段的模拟版本,将传递到此页面。我主要使用
StructReduce
ArrayAppend
ArrayList
的成员函数版本。我还使用
initialVal
可选参数将还原的
结果
值初始化为数组。在数组中插入一行之前,我检查该值是否有长度(如果需要,我也可以修剪),以便从最终列表中删除空元素。我还使用安全导航操作符(
?。
)进行一些基本验证,以确保元素存在(如表单未通过或缩减产生无效结果),并使其更具抗错误性

注:我相信当引入
ArrayReduce
时,可以将其恢复为与CF11兼容


如果您知道密钥的名称,只需从中提取值即可。类似于
form.myfieldname
。我不明白为什么循环是个问题。还有,你的总体目标是什么?显然,您正在遍历表单字段列表,但为什么?也许有更好的方法来解决您的更大问题。@Shawn我有动态表单数据要用mysql插入。所以我想知道是否有一个函数可以直接用于我的
insert
查询。现在我正在处理
INSERT-INTO
student`(#ListQualify(StructKeyList(form),“
”))值(#ListQualify(val,”))writeDump( fields.toList() )
<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>