Фильтруйте NSArray с другим NSArray, используя NSPredicate

Я хотел бы отфильтровать NSArray с другим NSArray с помощью NSPredicate

NSArray *a = @[@{@"key1": @"foo", @"key2": @(53), @"key3": @(YES)},
               @{@"key1": @"bar", @"key2": @(12), @"key3": @(YES)},
               @{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}];

NSArray *b = @[@{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}];

NSArray *expectedResult = @[@{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}];

Я попробовал что-то вроде:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"key1 like (key1 IN %@)", b];
NSArray *result = [a filteredArrayUsingPredicate:predicate];

Но, к сожалению, я не заставил это работать.

3 ответа

Решение

Используйте этот простой запрос. Для получения значения key1 из массива b ты должен использовать простой KVCvalueForKey: метод.

NSArray *a = @[@{@"key1": @"foo", @"key2": @(53), @"key3": @(YES)},
               @{@"key1": @"bar", @"key2": @(12), @"key3": @(YES)},
               @{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}];

NSArray *b = @[@{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}];

NSArray *expectedResult = @[@{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"key1 IN %@",[b valueForKey:@"key1"]];
NSArray *result = [a filteredArrayUsingPredicate:predicate];
NSLog(@"%@",result);

Вы можете сделать это, применив пересечение на NSSet

Вот пример

NSArray *a = @[@{@"key1": @"foo", @"key2": @(53), @"key3": @(YES)},
               @{@"key1": @"bar", @"key2": @(12), @"key3": @(YES)},
               @{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}];

NSArray *b = @[@{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}];
NSMutableSet *aIntersection = [NSMutableSet setWithArray:a];
[aIntersection intersectSet:[NSSet setWithArray:b]];
NSArray *expectedResult = [aIntersection allObjects];

Вы можете сделать это с помощью метода класса NSPredicate + ForexateWithBlock :

NSArray *a = @[@{@"key1": @"foo", @"key2": @(53), @"key3": @(YES)},
                   @{@"key1": @"bar", @"key2": @(12), @"key3": @(YES)},
                   @{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}];  
NSArray *b = @[@{@"key1": @"foobar", @"key2": @(42), @"key3": @(NO)}];   
NSArray *filteredArray = [a filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
        return [b containsObject:evaluatedObject];
    }]];
Другие вопросы по тегам