У меня есть массив, который имеет структуру ImageID и Custnum. Мне нужно найти определенный ImageID и получить Custnum для него. Я использую ColdFusion 8, у которого нет команды ArrayFind. Как бы это сделать, не зацикливая каждый элемент? Благодарю.ColdFusion 8 ArrayFind Substitute
ответ
На ваш вопрос можно ответить на вопрос «Is there a function similar to ArrayFind from ColdFusion 9 in ColdFusion 8?», но я не вижу другого способа, кроме цикла.
Вы всегда можете создать и использовать UDF, но ему придется использовать цикл.
Почему вы все равно не хотите использовать петлю? У вас есть много элементов в массиве? Не забудьте использовать cfbreak
после того, как вы обнаружите, что ваш элемент перестает проходить через остальную часть массива.
Учитывая вашу ситуацию, я не думаю, что arrayFind()
поможет вам в любом случае, чтобы найти что-то с arrayFind()
, вам нужно точно знать, что вы ищете. И хотя вы знаете свой ImageID
, вы не знаете связанного с ним связанного с ним Custnum
(отсюда и ваша основная проблема).
В CF нет ничего уродищевого, который мог бы помочь вам здесь, но есть 0D 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 функции, вам нужно обернуть ваши данные в структурах первым. Кроме этого, это довольно просто.
Спасибо, это полезно! Как тогда я буду использовать этот скрипт для массива в массиве. http://www.artphotoindex.com/api/exhibitions-new/utilities/test-array.cfm – user2654985
Ничего другого. structFindKey()/~ Value() будет пересекать столько уровней массива, сколько необходимо для поиска проверяемых структур. –
Хм. Я попробовал это без каких-либо результатов. Не могли бы вы проверить ссылку, чтобы увидеть, что я могу делать неправильно? http://artphotoindex.com/api/exhibitions-new/utilities/test-array.cfm – user2654985