การกรองอาร์เรย์ของอาร์เรย์ที่มีพจนานุกรมโดยใช้ NSPredicate

ฉันมีอาร์เรย์ชื่อ characterAndDescriptions ซึ่งมีหลายอาร์เรย์ และในแต่ละอาร์เรย์เหล่านั้นจะเป็น NSDictionary ที่มีคีย์/ค่าสองคีย์ ดูเหมือนว่านี้:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันจำเป็นต้องกรองอาร์เรย์นี้ตามค่าสำหรับคีย์ 'desc' โดยเปรียบเทียบกับตัวแปรสตริง searchText (และควรส่งคืนผลลัพธ์โดยที่สตริงนั้นมีอยู่ที่ใดก็ได้ในคำอธิบาย) ฉันต้องการให้โครงสร้างที่ส่งคืนเหมือนกับต้นฉบับ - อาร์เรย์ที่มีพจนานุกรมอยู่ภายในอาร์เรย์ นี่คือรหัสของฉัน:

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"desc contains[c] %@", searchText];
self.resultsArray = [self.charactersAndDescriptions filteredArrayUsingPredicate:resultPredicate];

ปัญหาคือ self.resultsArray ส่งคืนอ็อบเจ็กต์ 0 เสมอ ฉันไม่เข้าใจว่าทำไมถึงเป็นเช่นนั้น ฉันกำลังดูคำถามที่นี่ซึ่งมีพจนานุกรมเพียงชุดเดียว แต่ไม่พบพจนานุกรมสำหรับอาร์เรย์ที่ซ้อนกัน หวังว่าคุณจะช่วยได้ ขอบคุณ!


person Jordan H    schedule 14.04.2014    source แหล่งที่มา
comment
คุณต้องทำการค้นหาเชิงลึกเนื่องจากเป็นอาร์เรย์หลายระดับ   -  person Michael King    schedule 14.04.2014
comment
ฉันต้องการให้โครงสร้างที่ส่งคืนเหมือนกับต้นฉบับ - ยังคงเป็นอาร์เรย์ของพจนานุกรมในอาร์เรย์ ฉันจะทำการค้นหาเชิงลึกได้อย่างไร?   -  person Jordan H    schedule 14.04.2014


คำตอบ (1)


ฉันไม่แน่ใจว่าคุณสามารถทำได้ด้วยภาคแสดงเดียวหรือไม่ แต่คุณสามารถวนซ้ำผ่านอาร์เรย์แต่ละพจนานุกรม กรองและเพิ่มรายการที่กรองลงในอาร์เรย์สุดท้ายของคุณ ลองสิ่งนี้:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"desc contains[c] %@", searchText];
NSMutableArray *finalColletion = [NSMutableArray array];
for (NSArray *temp in self.charactersAndDescriptions) {
    NSArray *result =[temp filteredArrayUsingPredicate:predicate];
    if([result count] > 0) {
        [finalColletion addObject:result];
    }
}
person Shanti K    schedule 14.04.2014
comment
+1 แต่การตรวจสอบ [result count] > 0 จะป้องกันไม่ให้โค้ดของคุณสร้างอาร์เรย์เอาต์พุตที่ตรงกับอาร์เรย์อินพุต ไม่จำเป็นต้องตรวจสอบเนื่องจาก filteredArrayUsingPredicate จะส่งกลับอาร์เรย์ว่างที่ถูกต้องเมื่อไม่มีรายการที่ตรงกัน - person user3386109; 14.04.2014
comment
'filteredArrayUsingPredicate' จะส่งคืนอาร์เรย์ว่างหากไม่มีรายการที่ตรงกัน .. ไม่จำเป็นต้องเพิ่มลงในอาร์เรย์ผลลัพธ์สุดท้าย ดังนั้นการตรวจสอบ .. เหตุใดจึงต้องสร้างอาร์เรย์เอาต์พุต? มันจะสร้างอาร์เรย์เอาต์พุตที่ถูกต้อง - person Shanti K; 14.04.2014
comment
ดัชนีอาร์เรย์ระดับบนสุดจะไม่ตรงกันเว้นแต่ว่าอาร์เรย์ผลลัพธ์จะมีอาร์เรย์ว่างด้วย แต่นั่นอาจจะหรือไม่สำคัญก็ได้ ขึ้นอยู่กับว่าเขาใช้อาร์เรย์ผลลัพธ์อย่างไร - person user3386109; 14.04.2014
comment
มันสำคัญจริงๆ เพียงแต่ต้องทำให้โค้ดง่ายขึ้นเล็กน้อยเมื่อกรอกวิธีการแหล่งข้อมูล ดังนั้นฉันจึงลบคำสั่ง if นั้นออก ขอบคุณมากสำหรับคุณทั้งสอง! นั่นเป็นชิ้นส่วนสุดท้ายของปริศนา และตอนนี้การค้นหาของฉันกำลังสมบูรณ์แบบ และคืนนี้ฉันอาจจะได้พักผ่อนที่จำเป็นมาก :) - person Jordan H; 14.04.2014