等效于结构值的 StructKeyList()
Equivalent of StructKeyList() for struct value
StructKeyList()
将给我以逗号分隔的结构键列表。现在我需要获取以逗号分隔的结构值。现在这就是我为获得价值所做的事情
<cfloop collection="#form#" item="key" >
#form[key]#,
</cfloop>
如何在没有循环的情况下从结构中获取值列表?提前致谢。
我解决了你的问题。据我所知,不可能在单个函数中获得结构中的值列表。我们必须循环键并获取每个键的值。但是我可以给出一个解决方案来获取以逗号分隔的结构值。
<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的最后一个值。例如你的代码应该 return 10,20,30,.
所以你不需要那样做。使用 structfind 和 listappend 你也可以避免逗号结束。希望对你有帮助。
由于您使用的是 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
值初始化为数组。在向数组中插入一行之前,我检查该值是否具有长度(如果需要,我也可以 trim ),从而允许我从最终列表中删除空元素。我还使用安全导航运算符 (?.
) 进行一些基本验证,以确保元素存在(例如表单未通过或缩减产生无效结果)并使其更不易出错。
注意:我相信可以收回来与 CF11 兼容,当 ArrayReduce
被引入时。
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
StructKeyList()
将给我以逗号分隔的结构键列表。现在我需要获取以逗号分隔的结构值。现在这就是我为获得价值所做的事情
<cfloop collection="#form#" item="key" >
#form[key]#,
</cfloop>
如何在没有循环的情况下从结构中获取值列表?提前致谢。
我解决了你的问题。据我所知,不可能在单个函数中获得结构中的值列表。我们必须循环键并获取每个键的值。但是我可以给出一个解决方案来获取以逗号分隔的结构值。
<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的最后一个值。例如你的代码应该 return 10,20,30,.
所以你不需要那样做。使用 structfind 和 listappend 你也可以避免逗号结束。希望对你有帮助。
由于您使用的是 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
值初始化为数组。在向数组中插入一行之前,我检查该值是否具有长度(如果需要,我也可以 trim ),从而允许我从最终列表中删除空元素。我还使用安全导航运算符 (?.
) 进行一些基本验证,以确保元素存在(例如表单未通过或缩减产生无效结果)并使其更不易出错。
注意:我相信可以收回来与 CF11 兼容,当 ArrayReduce
被引入时。
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