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