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

问题描述 投票:0回答:5

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

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

...但这不适用于结构数组。我也知道我可以像这样暴力破解它:

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

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

algorithm arrays search coldfusion struct
5个回答
12
投票

除非您在构建数组时创建了一个哈希表,否则我不知道您将如何创建一个比您发布的 O(n) 解决方案更快的搜索函数。 不管怎样,当你构建数组时,你可以做这样的事情:

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

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

这假设该值始终存在。 您可能需要在调用之前检查 StructKeyExists(nameValues, "WhatImLookingFor") 。


10
投票

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

arrayIndex = ArrayFind(arrayOfStructs, function(struct){ 
   return struct.name == "WhatImLookingFor"; 
});

它没有记录,但它有效!如果您想要所有索引,ArrayFindAll() 也是一个选项。


1
投票

在不深入研究的情况下,我会考虑将结构转换为查询(如下),然后执行查询的查询..假设您的数据集不是太大!

http://www.bennadel.com/blog/264-Ask-Ben-Converting-A-Struct-To-A-Query-And-More-Java-.htm

分享你最终做了什么!

编辑:建议的 StructFindValue 看起来也很出色,我没想到要查找任何相关函数。


0
投票

CFGroovyFTW! :)

<cfset count = 0>
<g:script>
count = myArray.find({ 
  it["NAME"] == "WhatImLookingFor" }
})
</g:script>

或者..如果你更喜欢java风格(没有闭包)

<cfset count = 0>
<g:script>
for (i in myArray) {
  if( i["NAME"] == "WhatImLookingFor" )
    count++
}
</g:script>

© www.soinside.com 2019 - 2024. All rights reserved.