Фильтруйте 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
ты должен использовать простой KVC
valueForKey:
метод.
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];
}]];