У меня есть массив со структурой ImageID и Custnum. Мне нужно найти конкретный ImageID и получить для него Custnum. Я использую ColdFusion 8, в котором нет команды ArrayFind. Как бы я сделал это, не перебирая каждый элемент? Спасибо.
ColdFusion 8 ArrayFind Замена
Ответы (2)
На ваш вопрос можно ответить здесь "Есть ли функция аналогичная ArrayFind из ColdFusion 9 в ColdFusion 8?" но я не вижу другого выхода, кроме зацикливания.
Вы всегда можете создать и использовать UDF, но для этого придется использовать цикл.
Почему именно вы не хотите использовать цикл? У вас так много элементов в массиве? Просто не забудьте использовать cfbreak
после того, как найдете свой элемент, чтобы прекратить просмотр остальной части массива.
Учитывая вашу ситуацию, я не думаю, что 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, вам нужно сначала обернуть данные в структуру. Кроме того, это довольно прямой вперед.