Pengganti ColdFusion 8 ArrayFind

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.


person user2654985    schedule 09.09.2013    source sumber


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.

person Lucas    schedule 09.09.2013

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.

person Adam Cameron    schedule 09.09.2013
comment
Terima kasih ini bermanfaat! Lalu bagaimana saya menggunakan skrip ini untuk array di dalam array. artphotoindex.com/api/exhibitions-new/utilities/test- array.cfm - person user2654985; 09.09.2013
comment
Tidak berbeda. structFindKey() / ~Value() akan melintasi sebanyak mungkin level array untuk menemukan struct yang diperiksa. - person Adam Cameron; 09.09.2013
comment
Hmm. Saya mencobanya tanpa hasil. Bisakah Anda memeriksa tautan untuk melihat kesalahan apa yang saya lakukan? artphotoindex.com/api/exhibitions-new/utilities/test-array. cfm - person user2654985; 09.09.2013
comment
Yang bisa saya lihat hanyalah hasilnya, yang tidak membantu saya menebak kode apa yang Anda jalankan. Bisakah Anda memasukkan kode Anda ke dalam Intisari atau pastebin atau semacamnya? - person Adam Cameron; 09.09.2013
comment
Kode itu tidak banyak berguna bagi saya sobat... Saya tidak memiliki akses ke DB Anda, jadi saya tidak dapat menjalankan kode itu untuk melihat apa yang saya dapatkan. Bisakah Anda memberikan beberapa kode yang berdiri sendiri? Namun secara dangkal, sepertinya semuanya sah. Jadi agak membingungkan. - person Adam Cameron; 09.09.2013