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

Posted

技术标签:

【中文标题】按匹配不同数组的属性过滤字典数组【英文标题】: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。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于按匹配不同数组的属性过滤字典数组的主要内容,如果未能解决你的问题,请参考以下文章

通过匹配 id 属性过滤数组

如何使用 jq 按元素属性值过滤对象数组?

过滤数组并匹配至少一个条件

使用 NSPredicate 过滤数组的 NSDictionary

根据来自不同对象数组的属性和值过滤对象数组

如何过滤对象数组并根据特定属性变得不同