Bagaimana cara memfilter array menggunakan array?

Saya memiliki tiga jenis kelas khusus (lihat di bawah) dan tiga array ComponentList, ComponentGroupList, dan ComponentGroupItemList. Array tidak terhubung, masing-masing berisi semua objek. Saya perlu memfilter komponen tertentu, semua grup terkaitnya, dan semua item terkaitnya.

Sekarang, saya tahu cara memfilter ComponentList menggunakan @"componentId==123" dan mendapatkan objek komponen yang diinginkan. Saya juga dapat memfilter grupnya dari ComponentGroupList menggunakan predikat yang sama, karena objek ComponentGroup berisi kunci ComponentId yang sama. Namun, saya tidak tahu cara memfilter objek ComponentGroupItem terkait dari ComponentGroupItemList.

Saat ini, saya telah memfilter array yang berisi objek ComponentGroup, dan saya ingin memfilter componentGroupItemList menggunakan array itu. Apakah mungkin, atau apakah saya perlu mengekstrak semua nilai "groupId" dari filteredComponentGroupList ke dalam string dan kemudian membuat predikat?

Kelas-kelas:

@interface Component : NSObject

  @property (nonatomic, strong) NSNumber *componentId;
  @property (nonatomic, strong) NSString *title;

@end

@interface ComponentGroup : NSObject

  @property (nonatomic, strong) NSNumber *groupId;
  @property (nonatomic, strong) NSNumber *componentId;
  @property (nonatomic, strong) NSString *title;

@end

@interface ComponentGroupItem : NSObject

  @property (nonatomic, strong) NSNumber *itemId;
  @property (nonatomic, strong) NSNumber *groupId;
  @property (nonatomic, strong) NSString *title;

@end

person Centurion    schedule 07.05.2013    source sumber


Jawaban (2)


Anda harus mengekstrak id grup terlebih dahulu

NSArray *groupIds = [filteredComponentGroupList valueForKey:@"groupId"];

dan menggunakannya untuk predikat

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"groupId IN %@", groupIds];
NSArray *filteredComponentGroupItemList = [componentGroupItemList filteredArrayUsingPredicate:predicate];
person Martin R    schedule 07.05.2013

Sekilas struktur data Anda tampak agak berlebihan, tapi saya rasa Anda sudah memikirkannya dengan matang.

Jika saya memahami kebutuhan Anda dengan benar, Anda memiliki larik grup komponen yang sudah difilter (sebut saja filteredComponentGroups) dan Anda ingin memfilter larik lain (componentGroupItemList) menggunakan filteredComponentGroups.

Dalam hal ini Anda dapat menggunakan operator IN dari NSPredicate dan membuat larik ID dengan valueForKey: pada larik tersebut. valueForKey: pada array membuat array baru dengan hanya nilai kunci tersebut dari setiap objek dalam koleksi asli. Sangat ampuh untuk situasi seperti ini.

 NSArray *filteredComponentGroups = // ... your filtered components

 NSArray *componentIdsFromFilteredComponentGroups = [filteredComponentGroups valueForKey: @"groupId"];
 NSPredicate *inFilteredComponentGroupsP = [NSPredicate predicateWithFormat: @"groupId IN %@", componentIdsFromFilteredComponentGroups];

 NSArray *filteredGroupItemList = [componentGroupItemList filteredArrayUsingPredicate: inFilteredComponentGroupsP];

Diketik langsung di browser, jadi waspadai kesalahan ketik.

person Monolo    schedule 07.05.2013
comment
Sekarang Anda 8 detik lebih cepat :-) - Jika saya memahaminya dengan benar, kunci yang diperlukan adalah groupId, bukan ComponentId, tapi saya mungkin salah. - person Martin R; 07.05.2013