我在ColdFusion中有一个半大(数百个记录)的1维数组。数组中的每个项都是具有多个属性的结构。我想在数组中搜索具有特定“name”属性的结构。我知道对于一个字符串值数组,我可以使用像这样的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”属性,并且数组中没有间隙或其他对象。
答案 0 :(得分:11)
除非您在构建阵列时创建了哈希表,否则我不会看到您将如何创建比您发布的O(n)解决方案更快的搜索功能。无论如何,在构建阵列时,你可以这样做:
<cfloop query="qryValues">
<cfset nameValues[name] = currentrow />
<cfset myArray[currentrow].name = name />
</cfloop>
<cfset arrayIndex = nameValues["WhatImLookingFor"] />
这假定值始终存在。在进行调用之前,您可能需要检查StructKeyExists(nameValues,“WhatImLookingFor”)。
答案 1 :(得分:6)
在CF 10或Railo 4中,您可以使用:
arrayIndex = ArrayFind(arrayOfStructs, function(struct){
return struct.name == "WhatImLookingFor";
});
没有记录,但它有效!如果你想要所有的索引,ArrayFindAll()也是一个选项。
答案 2 :(得分:1)
如果不深入研究,我会考虑将结构转换为查询(下方),然后对查询进行查询...假设您的数据集不是太大!
http://www.bennadel.com/blog/264-Ask-Ben-Converting-A-Struct-To-A-Query-And-More-Java-.htm
分享你最终做的事情!
编辑:建议的StructFindValue看起来也很优秀,我不想查找任何相关的功能。
答案 3 :(得分:0)
CFGroovy FTW! :)
<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>
答案 4 :(得分:-1)
您要么使用StructFindValue,要么使用StructFindKey