Memfilter array array yang berisi kamus menggunakan NSPredicate

Saya memiliki array berjudul characterAndDescriptions yang berisi beberapa array, dan di masing-masing array tersebut terdapat NSDictionary dengan dua kunci/nilai. Ini terlihat seperti ini:

masukkan deskripsi gambar di sini

Saya perlu memfilter array ini pada nilai kunci 'desc', membandingkannya dengan variabel string searchText (dan itu akan mengembalikan hasil di mana string itu ada di mana saja di desc). Saya ingin struktur yang dikembalikan sama dengan aslinya - array yang berisi kamus di dalam array. Ini kode saya:

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

Masalahnya adalah, self.resultsArray selalu mengembalikan 0 objek. Saya tidak mengerti mengapa hal itu terjadi. Saya sedang melihat pertanyaan di sini di mana mereka hanya memiliki satu array kamus tetapi tidak dapat menemukan apapun untuk array bersarang. Semoga Anda dapat membantu, terima kasih!


person Jordan H    schedule 14.04.2014    source sumber
comment
Anda harus melakukan pencarian mendalam karena ini adalah array multi level   -  person Michael King    schedule 14.04.2014
comment
Saya ingin struktur yang dikembalikan sama dengan aslinya - masih array kamus dalam array. Bagaimana cara melakukan pencarian mendalam?   -  person Jordan H    schedule 14.04.2014


Jawaban (1)


Saya tidak yakin apakah Anda bisa melakukannya dengan satu predikat. Namun Anda dapat mengulangi array kamus individual, memfilternya, dan menambahkan daftar yang difilter ke array akhir Anda. Cobalah sesuatu seperti ini:

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 tetapi pemeriksaan [result count] > 0 akan mencegah kode Anda menghasilkan larik keluaran yang cocok dengan larik masukan. Pemeriksaan tidak diperlukan karena filteredArrayUsingPredicate akan mengembalikan array kosong yang valid ketika tidak ada kecocokan. - person user3386109; 14.04.2014
comment
'filteredArrayUsingPredicate' akan mengembalikan array kosong jika tidak ada yang cocok.. tidak perlu menambahkannya ke array hasil akhir. Oleh karena itu pemeriksaannya.. Mengapa ia muncul dari menghasilkan array keluaran? Ini akan menghasilkan array keluaran yang valid - person Shanti K; 14.04.2014
comment
Indeks array tingkat atas tidak akan cocok kecuali array hasil menyertakan array kosong, tapi itu mungkin penting atau tidak tergantung pada bagaimana dia menggunakan array hasil. - person user3386109; 14.04.2014
comment
Memang penting, hanya untuk menyederhanakan sedikit kode saat mengisi metode sumber data, jadi saya menghapus pernyataan if itu. Terima kasih banyak untuk Anda berdua! Itu adalah bagian terakhir dari teka-teki itu dan sekarang pencarianku berjalan sempurna dan aku mungkin mendapatkan istirahat yang sangat dibutuhkan malam ini. :) - person Jordan H; 14.04.2014