Saya memiliki array yang memiliki struktur ImageID dan Custnum. Saya perlu menemukan ImageID tertentu dan mengambil Custnum untuk itu. Saya menggunakan ColdFusion 8 yang tidak memiliki perintah ArrayFind. Bagaimana saya melakukan ini tanpa mengulang setiap item? Terima kasih.
Pengganti ColdFusion 8 ArrayFind
Jawaban (2)
Pertanyaan Anda mungkin terjawab sampai pada titik di sini "Apakah ada fungsi yang mirip dengan ArrayFind dari ColdFusion 9 di ColdFusion 8?" tetapi saya tidak melihat cara lain selain perulangan.
Anda selalu dapat membuat dan menggunakan UDF tetapi harus menggunakan perulangan.
Mengapa sebenarnya Anda tidak ingin menggunakan perulangan? Apakah Anda memiliki banyak elemen dalam array? Ingatlah untuk menggunakan cfbreak
setelah menemukan elemen Anda untuk berhenti menelusuri sisa array.
Mengingat situasi Anda, menurut saya arrayFind()
tidak akan banyak membantu Anda, karena untuk menemukan sesuatu dengan arrayFind()
, Anda harus tahu persis apa yang Anda cari. Dan meskipun Anda mengetahui ImageID
Anda, Anda tidak mengetahui Custnum
yang terkait dengannya (karena itulah masalah mendasar Anda).
Tidak ada CF asli yang dapat membantu Anda di sini, tetapi ada UDF di CFLib - structFindKeyWithValue()
yang akan membantu.
Ini ditulis untuk CF9, tetapi dengan mudah di-backport ke CF8. Versi yang dimodifikasi dan ramah CF8 - ada pada contoh di bawah ini:
<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#">
Perhatikan bahwa karena ini adalah fungsi stuct, Anda perlu menggabungkan data Anda dalam sebuah struct terlebih dahulu. Selain itu, ini cukup lurus.