ColdFusion - 搜索结构数组的有效方法是什么?

Jos*_*ody 13 arrays algorithm coldfusion search struct

我在ColdFusion中有一个半大(数百个记录)的1维数组.数组中的每个项都是具有多个属性的结构.我想在数组中搜索具有特定"name"属性的结构.我知道对于一个字符串值数组,我可以使用Java方法,如下所示:

<cfset arrayIndex = myArray.indexOf("WhatImLookingFor") + 1>
Run Code Online (Sandbox Code Playgroud)

...但这对结构数组不起作用.我也知道我可以这样蛮力:

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

......但我觉得必须有一种更有效的方法.有人有比这更好的解决方案吗?您可以假设每个结构中都存在"name"属性,并且数组中没有间隙或其他对象.

Sol*_*nal 11

除非您在构建阵列时创建了哈希表,否则我不会看到您将如何创建比您发布的O(n)解决方案更快的搜索功能.无论如何,在构建数组时,您可以执行以下操作:

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

<cfset arrayIndex = nameValues["WhatImLookingFor"] />
Run Code Online (Sandbox Code Playgroud)

这假定值始终存在.在进行调用之前,您可能需要检查StructKeyExists(nameValues,"WhatImLookingFor").


Rus*_*uss 6

在CF 10或Railo 4中,您可以使用:

arrayIndex = ArrayFind(arrayOfStructs, function(struct){ 
   return struct.name == "WhatImLookingFor"; 
});
Run Code Online (Sandbox Code Playgroud)

它没有记录,但它的工作原理!如果您想要所有索引,ArrayFindAll()也是一个选项.