Подтвердить что ты не робот

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" присутствует в каждой структуре, и в массиве нет пробелов или других объектов.

4b9b3361

Ответ 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>