У меня есть NSMutableArray
из NSDictionaries
, и каждый словарь содержит NSSet
объект, который в основном является другим сущностью, как многие из многих, отношениями в основных данных. Что я хочу, зависит от определенного значения NSSet
Я хочу отфильтровать мой NSMutableArray
. Пожалуйста, предложите, как подойти.Как фильтровать данные, которые являются массивом словарей, и каждый словарь содержит объект NSSet
Q
Как фильтровать данные, которые являются массивом словарей, и каждый словарь содержит объект NSSet
0
A
ответ
1
NSPredicate для спасения.
#import <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
@autoreleasepool {
// I have NSMutableArray ...
NSMutableArray *array = [NSMutableArray new];
NSArray *result = nil;
// ... of NSDictionaries ...
// ... each dictionary contains NSSet object which is basically other entity ...
NSDictionary *dict1 = @{ @"name": @"Adam",
@"age": @(47),
@"children": [NSSet setWithArray:@[ @"Alan", @"Bobby", @"Chuckie" ]]};
NSDictionary *dict2 = @{ @"name": @"Bob",
@"age": @(37),
@"children": [NSSet setWithArray:@[ @"Brian", @"Chaz", @"Donald" ]]};
NSDictionary *dict3 = @{ @"name": @"Charlie",
@"age": @(27),
@"children": [NSSet setWithArray:@[ @"Caaaaaarl", @"Donnie", @"Eddy" ]]};
// ...
[array addObject:dict1];
[array addObject:dict2];
[array addObject:dict3];
// So, let's find children (stirngs) who contain 'd'
// This should be Bob and Charlie.
NSPredicate *predicate = nil;
predicate = [NSPredicate predicateWithFormat:@"ANY children CONTAINS[cd] %@", @"D"];
result = [array filteredArrayUsingPredicate:predicate];
NSLog(@"%@", result);
// {
// age = 37;
// children = "{(\n Brian,\n Chaz,\n Donald\n)}";
// name = Bob;
// },
// {
// age = 27;
// children = "{(\n Donnie,\n Eddy,\n Caaaaaarl\n)}";
// name = Charlie;
// }
}
}
Как вы можете видеть, вы можете использовать NSPredicate для фильтрации глубоких коллекций. Операторы коллекции меняются в зависимости от того, что вы пытаетесь сделать. Более подробная информация доступна по адресу Apple NSPredicate docs.