使用NSPredicate使用另一个NSArray过滤NSArray

时间:2014-07-01 10:10:38

标签: ios objective-c 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 个答案:

答案 0 :(得分:2)

使用这个简单的查询。要从数组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);

答案 1 :(得分:1)

您可以通过在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];

答案 2 :(得分:0)

您可以通过 NSPredicate 类方法执行此操作 + predicateWithBlock:

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];
    }]];