ColdFusion - What's an efficient way to search an array of structs?

Joshua Carmody picture Joshua Carmody · May 14, 2009 · Viewed 11.6k times · Source

I have a semi-large (hundreds of records) 1-dimensional array in ColdFusion. Each item in the array is a struct with several properties. I want to search the array for a struct that has a specific "name" property. I know that for an array of string values I could use Java methods like so:

<cfset arrayIndex = myArray.indexOf("WhatImLookingFor") + 1>

...but that won't work for an array of structs. I also know I could brute-force it like this:

<cfset arrayIndex = 0>
<cfloop from="1" to="#ArrayLen(myArray)#" index="counter">
    <cfif myArray[counter].name IS "WhatImLookingFor">
        <cfset arrayIndex = counter>
    </cfif>
</cfloop>

...but I feel like there must be a more efficient way. Does anyone have a better solution than this? You can assume that the "name" property is present in every struct and there are no gaps or other objects in the array.

Answer

Soldarnal picture Soldarnal · May 15, 2009

Unless you have a hash table you're creating as you build the array, I don't see how you're going to create a search function that is faster than the O(n) solution you've posted. Anyway, while you are building your arrays, you could do something like this:

<cfloop query="qryValues">
    <cfset nameValues[name] = currentrow />
    <cfset myArray[currentrow].name = name />
</cfloop>

<cfset arrayIndex = nameValues["WhatImLookingFor"] />

This assumes that the value always exists. You may need to check StructKeyExists(nameValues, "WhatImLookingFor") before making the call.