ColdFusion 8 ArrayFind Замена

У меня есть массив со структурой ImageID и Custnum. Мне нужно найти конкретный ImageID и получить для него Custnum. Я использую ColdFusion 8, в котором нет команды ArrayFind. Как бы я сделал это, не перебирая каждый элемент? Спасибо.


person user2654985    schedule 09.09.2013    source источник


Ответы (2)


На ваш вопрос можно ответить здесь "Есть ли функция аналогичная ArrayFind из ColdFusion 9 в ColdFusion 8?" но я не вижу другого выхода, кроме зацикливания.

Вы всегда можете создать и использовать UDF, но для этого придется использовать цикл.

Почему именно вы не хотите использовать цикл? У вас так много элементов в массиве? Просто не забудьте использовать cfbreak после того, как найдете свой элемент, чтобы прекратить просмотр остальной части массива.

person Lucas    schedule 09.09.2013

Учитывая вашу ситуацию, я не думаю, что arrayFind() поможет вам в любом случае, так как, чтобы найти что-то с помощью arrayFind(), вам все равно нужно точно знать, что вы ищете. И хотя вы знаете свой ImageID, вы не знаете связанного с ним Custnum (отсюда и основная проблема).

В CF нет ничего нативного, что могло бы вам здесь помочь, но есть UDF на CFLib - structFindKeyWithValue(), который поможет.

Он написан для CF9, но легко портируется на CF8. Модифицированная версия, совместимая с CF8, приведена в примере ниже:

<cfscript>
a = [
    {ImageID=1, Custnum=1},
    {ImageID=2, Custnum=2},
    {ImageID=3, Custnum=3},
    {ImageID=4, Custnum=4}
];
testStruct = {a=a};
result = structFindKeyWithValue(testStruct, "ImageID", 2, "ONE");

function structFindKeyWithValue(struct, key, value, scope){
    var keyResult = false;
    var valueResult = [];
    var i = 0;

    if (!isValid("regex", arguments.scope, "(?i)one|all")){
        throw(type="InvalidArgumentException", message="Search scope #arguments.scope# must be ""one"" or ""all"".");
    }
    keyResult = structFindKey(struct, key, "all");
    for (i=1; i <= arrayLen(keyResult); i++){
        if (keyResult[i].value == value){
            arrayAppend(valueResult, keyResult[i]);
            if (scope == "one"){
                break;
            }
        }
    }
    return valueResult;
}
</cfscript>
<cfdump var="#result#">

Обратите внимание: поскольку это функция stuct, вам нужно сначала обернуть данные в структуру. Кроме того, это довольно прямой вперед.

person Adam Cameron    schedule 09.09.2013
comment
Спасибо, это полезно! Как бы я тогда использовал этот скрипт для массива внутри массива. artphotoindex.com/api/exhibitions-new/utilities/test- массив.cfm - person user2654985; 09.09.2013
comment
Без разницы. structFindKey() / ~Value() будет проходить столько уровней массива, сколько необходимо, чтобы найти проверяемые структуры. - person Adam Cameron; 09.09.2013
comment
Хм. Я пробовал безрезультатно. Не могли бы вы проверить ссылку, чтобы увидеть, что я могу делать неправильно? artphotoindex.com/api/exhibitions-new/utilities/test-array. куб. м - person user2654985; 09.09.2013
comment
Все, что я вижу, это вывод, который не помогает мне угадать, какой код вы используете. Можете ли вы поместить свой код в gist или pastebin или что-то в этом роде? - person Adam Cameron; 09.09.2013
comment
Этот код не очень полезен для меня, приятель... У меня нет доступа к вашей БД, поэтому я не могу запустить этот код, чтобы посмотреть, что я получу. Не могли бы вы предоставить какой-нибудь автономный код? Но внешне кажется, что все законно. Так немного озадачивает. - person Adam Cameron; 09.09.2013