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

问题描述 投票:0回答:3

我有两个数组,我试图用第二个数组(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。

objective-c arrays core-data dictionary predicate
3个回答
1
投票
NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    return [[array2 valueForKey:@"name"] containsObject:[evaluatedObject objectForKey:@"name"]];
}];

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


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

在这个例子中,arrayOneNSArray对象的NSDictionary。每个对象都有一个密钥name

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

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

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

接下来,我们使用arrayOne方法枚举-enumerateObjectsUsingBlock:中的对象。在这个例子中,我们知道obj参数是一个NSDictionary,它有一个密钥name。我们可以简单地调用NSDictionary并将值存储在我们的局部变量-objectForKey:中,而不是转换为-valueForKey:并调用name。然后我们检查name是否在values数组中,如果是,请将它添加到我们的filteredValues

© www.soinside.com 2019 - 2024. All rights reserved.