按匹配不同数组的属性过滤字典数组
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;
在示例中,arrayOne
是 NSArray
的 NSDictionary
对象。每个对象都有一个name
的键。
arrayTwo
中包含的对象是具有name
属性的基本 NSObject 子类。
为了获取arrayTwo
中所有对象的名称属性值,我们使用了键值编码方法-valueForKey:
,它在接收器中的每个对象上调用-valueForKey:
,并返回一个数组结果。
然后我们创建一个NSMutableArray
来保存来自arrayOne
的过滤结果。
接下来我们使用-enumerateObjectsUsingBlock:
方法枚举arrayOne
中的对象。在这个例子中,我们知道obj
参数是一个NSDictionary
,它的键是name
。我们可以简单地调用-valueForKey:
并将值存储在我们的局部变量name
中,而不是转换为NSDictionary
并调用-objectForKey:
。然后我们检查name
是否在values
数组中,如果是,将其添加到我们的filteredValues
。
【讨论】:
以上是关于按匹配不同数组的属性过滤字典数组的主要内容,如果未能解决你的问题,请参考以下文章