我有一个这样的嵌套结构 struct1.struct2.foo
.我想检查 foo
存在。但是,struct2
也不保证存在。我讨厌使用 isDefined()
,但我也认为调用 structKeyExists()
两次是浪费的(例如,if (structKeyExists(struct, 'struct2') && structKeyExists(struct.struct2, 'foo')) {}
我考虑过使用structFindKey()
,但是如果存在 struct1.foo
,我不想遇到问题
有没有更好的方法来实现这一点?
这是一个与 this question 类似的问题。 ,但我不是在处理 XML 文档,因此该帖子中的大多数答案对我都不起作用。
最佳答案
这是前面一个问题的核心问题(虽然更简洁):
How to dynamically loop through an array of structures
我会提供同样的答案。
How to dynamically loop through an array of structures
要重复基本部分,以下功能应该可以满足您的要求:
<cffunction name="StructGetByKeyList">
<cfargument name="struct">
<cfargument name="key">
<cfif StructKeyExists(struct,ListFirst(key,"."))>
<cfif ListLen(key,".") GT 1>
<cfreturn StructGetByKeyList(struct[ListFirst(key,".")],ListRest(key,"."))>
<cfelse>
<cfreturn struct[key]>
</cfif>
<cfelse>
<cfreturn "">
</cfif>
</cffunction>
然后你可以只调用 StructGetByKeyList(struct1,"struct2.foo") ,如果它存在,它将返回键的字符串,如果不存在则返回一个空字符串。
要改为返回 bool 值,请使用以下命令:
<cffunction name="StructNestedKeyExists">
<cfargument name="struct">
<cfargument name="key">
<cfif StructKeyExists(struct,ListFirst(key,"."))>
<cfif ListLen(key,".") GT 1>
<cfreturn StructNestedKeyExists(struct[ListFirst(key,".")],ListRest(key,"."))>
<cfelse>
<cfreturn true>
</cfif>
<cfelse>
<cfreturn false>
</cfif>
</cffunction>
关于coldfusion - 对嵌套对象使用 structKeyExists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14969221/