ColdFusion - эффективный способ поиска массива структур?
У меня есть полумалый (сотни записей) 1-мерный массив в ColdFusion. Каждый элемент массива представляет собой структуру с несколькими свойствами. Я хочу найти массив для структуры, которая имеет определенное свойство "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" присутствует в каждой структуре, и в массиве нет пробелов или других объектов.
Ответы
Ответ 1
Если у вас нет хеш-таблицы, которую вы создаете при создании массива, я не вижу, как вы собираетесь создавать функцию поиска, которая быстрее, чем решение O (n), которое вы разместили. Во всяком случае, пока вы строите свои массивы, вы можете сделать что-то вроде этого:
<cfloop query="qryValues">
<cfset nameValues[name] = currentrow />
<cfset myArray[currentrow].name = name />
</cfloop>
<cfset arrayIndex = nameValues["WhatImLookingFor"] />
Это предполагает, что значение всегда существует. Перед выполнением вызова вам может потребоваться проверить StructKeyExists (nameValues, "WhatImLookingFor" ).
Ответ 2
В CF 10 или Railo 4 вы можете использовать:
arrayIndex = ArrayFind(arrayOfStructs, function(struct){
return struct.name == "WhatImLookingFor";
});
Не документировано, но работает! ArrayFindAll() также является опцией, если вы хотите все индексы.
Ответ 3
Не смотря на это слишком глубоко, я бы подумал о преобразовании структуры в запрос (см. ниже), а затем выполнил запрос запроса. Предполагая, что ваш набор данных не слишком большой!
http://www.bennadel.com/blog/264-Ask-Ben-Converting-A-Struct-To-A-Query-And-More-Java-.htm
Делитесь тем, что вы делали!
Изменить: предлагаемый StructFindValue выглядит отлично, я не думал искать какие-либо соответствующие функции.
Ответ 4
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>
Ответ 5
Вы либо хотите использовать StructFindValue или StructFindKey
http://livedocs.adobe.com/coldfusion/7/htmldocs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=ColdFusion_Documentation&file=00000640.htm#137597
http://livedocs.adobe.com/coldfusion/7/htmldocs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=ColdFusion_Documentation&file=00000639.htm#137550