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 คุณจึงต้องรวมข้อมูลของคุณไว้ในโครงสร้างก่อน นอกนั้นก็ fwd ค่อนข้างตรงครับ

person Adam Cameron    schedule 09.09.2013
comment
ขอบคุณ สิ่งนี้มีประโยชน์! ฉันจะใช้สคริปต์นี้กับอาร์เรย์ภายในอาร์เรย์ได้อย่างไร artphotoindex.com/api/exhibitions-new/utilities/test- array.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
ทั้งหมดที่ฉันเห็นคือผลลัพธ์ซึ่งไม่ได้ช่วยฉันเดาว่าคุณใช้รหัสอะไร คุณสามารถใส่รหัสของคุณในส่วนสำคัญหรือ pastebin หรืออะไรสักอย่างได้ไหม? - person Adam Cameron; 09.09.2013
comment
รหัสนั้นไม่ได้มีประโยชน์สำหรับฉันมากนักเพื่อน... ฉันไม่มีสิทธิ์เข้าถึงฐานข้อมูลของคุณ ดังนั้นฉันจึงไม่สามารถเรียกใช้รหัสนั้นเพื่อดูว่าฉันได้รับอะไร โปรดระบุรหัส แบบสแตนด์อโลน บางส่วนได้ไหม แต่เผินๆ ดูเหมือนว่าทุกอย่างจะถูกต้องตามกฎหมาย เลยค่อนข้างน่าสงสัยนิดหน่อย - person Adam Cameron; 09.09.2013