我有两个数组,我正在尝试使用第二个数组(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。
答案 0 :(得分:1)
这适用于IN
:
NSArray *matchSet = [self.array2 valueForKey:@"name"];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"name IN @%",matchSet];
输入Safari。
答案 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;
}
在示例中,arrayOne
是NSArray
个NSDictionary
个对象。每个对象都有一个name
的键。
arrayTwo
中包含的对象是具有name
属性的基本NSObject子类。
要获取arrayTwo
中所有对象的名称属性的值,我们使用键值编码方法-valueForKey:
,该方法在接收器中的每个对象上调用-valueForKey:
并返回结果数组。
然后我们创建NSMutableArray
来保存来自arrayOne
的过滤结果。
接下来,我们使用arrayOne
方法枚举-enumerateObjectsUsingBlock:
中的对象。在此示例中,我们知道obj
参数是NSDictionary
,其密钥为name
。我们只需调用NSDictionary
并将值存储在本地变量-objectForKey:
中,而不是转换为-valueForKey:
并调用name
。然后,我们会检查name
数组中是否有values
,如果是,请将其添加到我们的filteredValues
。