【问题标题】:filter dictionary array by property that matches a different array按匹配不同数组的属性过滤字典数组
【发布时间】:2014-08-08 18:53:46
【问题描述】:

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

   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


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

    【讨论】:

      【解决方案2】:

      这应该适用于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

      【讨论】:

        【解决方案3】:

        这里有一个简单的例子来说明如何做到这一点:

        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 的过滤结果。

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

        【讨论】:

          猜你喜欢
          • 2022-01-11
          • 1970-01-01
          • 2016-03-30
          • 1970-01-01
          • 2016-08-10
          • 2021-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多