tags:

views:

1104

answers:

2

I would like to test:

<cfif Exists(MyStruct["mittens"])>
</cfif>

If the "mittens" key doesn't exist in MyStruct, what will it return? 0, or ""??

What should replace Exists function?

UPDATE

I tried,

<cfif IsDefined(MyStruct.mittens)>

Which also throws the error

Element Mittens is undefined in MyStruct.

+1  A: 

Found the answer here

It's StructKeyExists

CVertex
IsDefined would work as well, but it's slower.
Tomalak
The reason IsDefined wasn't working for you as typed was the missing double quotes. Instead of looking for the 'mittens' struct key, it was trying to dereference the mittens key to see check for existance. That's why you were still getting the error
Dan Cramer
+14  A: 

To test for key existence, I recommend:

<cfif StructKeyExists(MyStruct, "mittens")>

<!--- or --->

<cfset key = "mittens">
<cfif StructKeyExists(MyStruct, key)>

Behind the scenes this calls the containsKey() method of the java.util.map the ColdFusion struct is based on. This is arguably the fastest method of finding out if a key exists.

The alternative is:

<cfif IsDefined("MyStruct.mittens")>

<!--- or --->

<cfset key = "mittens">
<cfif IsDefined("MyStruct.#key#")>

Behind the scenes this calls Eval() on the passed string (or so I believe) and tells you if the result is a variable reference. In comparison this is slower than StructKeyExists(). On the plus side: You can test for a sub-key in a nested structure in one call:

<cfif IsDefined("MyStruct.with.some.deeply.nested.key")>
Tomalak