algorithmarrayssearchcoldfusionstruct

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


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.


Solution

  • 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.