按属性匹配不同数组的字典数组

时间:2014-08-08 18:53:47

标签: objective-c arrays core-data dictionary predicate

我有两个数组,我正在尝试使用第二个数组(array2)中存在的匹配属性过滤第一个(array1)。第一个数组是一个带有键'name'的字典数组。第二个数组是具有属性“name”的对象数组。是否可以过滤'array1'的内容并仅显示那些在'array2'中找到匹配'name'的内容? 我试过了:

   NSPredicate *pred = [NSPredicate predicateWithFormat:@"name == @%",self.array2];
   NSArray *results = [array1 filteredArrayUsingPredicate:pred];
   NSLog(@"The results array is %@", results);

而不是'=='我尝试了'IN'和'@K'以及'self'的混合,但它崩溃或结果为0。

3 个答案:

答案 0 :(得分:1)

这适用于IN

NSArray *matchSet = [self.array2 valueForKey:@"name"];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"name IN @%",matchSet];

输入Safari。

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795-215891

答案 1 :(得分:1)

NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    return [[array2 valueForKey:@"name"] containsObject:[evaluatedObject objectForKey:@"name"]];
}];

答案 2 :(得分:0)

以下是如何实现此目标的快速示例:

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        NSArray *arrayOne = @[@{@"name": @"Alvin"}, @{@"name": @"Brian"}, @{@"name": @"Charlie"}];

        BMPPerson *alvin = [[BMPPerson alloc] initWithName:@"Alvin"];
        BMPPerson *charlie = [[BMPPerson alloc] initWithName:@"Charlie"];

        NSArray *arrayTwo = @[alvin, charlie];

        NSArray *values = [arrayTwo valueForKey:@"name"];
        NSMutableArray *filteredValues = [NSMutableArray array];

        [arrayOne enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            NSString *name = [obj valueForKey:@"name"];
            if ([values containsObject:name]) {
                [filteredValues addObject:name];
            }
        }];

        NSLog(@"%@", filteredValues);
    }
    return 0;
}

在示例中,arrayOneNSArrayNSDictionary个对象。每个对象都有一个name的键。

arrayTwo中包含的对象是具有name属性的基本NSObject子类。

要获取arrayTwo中所有对象的名称属性的值,我们使用键值编码方法-valueForKey:,该方法在接收器中的每个对象上调用-valueForKey:并返回结果数组。

然后我们创建NSMutableArray来保存来自arrayOne的过滤结果。

接下来,我们使用arrayOne方法枚举-enumerateObjectsUsingBlock:中的对象。在此示例中,我们知道obj参数是NSDictionary,其密钥为name。我们只需调用NSDictionary并将值存储在本地变量-objectForKey:中,而不是转换为-valueForKey:并调用name。然后,我们会检查name数组中是否有values,如果是,请将其添加到我们的filteredValues