如何按特定字段过滤对象数组?
我的代码:
NSMutableArray *inputArray = [[NSMutableArray alloc]init];
Person *person = [[Person alloc]init];
person.first_name = @"John";
[inputArray addObject: person];
person = [[Person alloc]init];
person.first_name = @"Jack";
[inputArray addObject: person];
NSString *expression = [NSString stringWithFormat:@"SUBQUERY(inputArray, $object, $object.first_name CONTAINS[c] J"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:expression];
NSMutableArray *filteredArray = [[inputArray filteredArrayUsingPredicate:predicate]mutableCopy];
NSLog(@"Count should be 2: %lu",(unsigned long)filteredArray.count);
这是我得到的错误:
'NSInvalidArgumentException', reason: 'Unable to parse the format string "SUBQUERY(inputArray, $object, $object.first_name CONTAINS[c] J"'
这是测试的基本示例。实际情况是我有一个对象数组(Person或其他),我想通过对象中的某些字段过滤该数组,即first_name。作为用户类型,我们将根据他们输入的内容过滤视觉列表 - 因此输入" J"会产生2个结果,但是当他们输入" Jo"只有"约翰"出现在名单上。
我做错了什么?
修改
似乎还没有奏效。更新的代码:
DOVisitor *vi = [inputArray objectAtIndex:0];
NSLog(@"NAME: %@",vi.first_name);
NSPredicate *firstNamePredicate=[NSPredicate predicateWithFormat:@"first_name LIKE[cd] %@", @"Jo"];
NSPredicate *lastNamePredicate =[NSPredicate predicateWithFormat:@"last_name LIKE[cd] %@", @"Jo"];
NSPredicate *finalPredicate = [NSCompoundPredicate orPredicateWithSubpredicates : @[firstNamePredicate, lastNamePredicate]];
NSArray *filteredArray = [[inputArray filteredArrayUsingPredicate:finalPredicate]mutableCopy];
NSLog(@"Count should be 1: %d", [filteredArray count]);
我得到一个空数组。但是,当我打印inputArray的第一个对象时,控制台会记录" John"
修改
使用CONTAINS代替LIKE可以解决问题
答案 0 :(得分:1)
你不需要这个子查询,这是一个非常基本的过滤器。
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"first_name CONTAINS[cd] %@", @"j"];
答案 1 :(得分:1)
我们假设您有Person
个对象,并且您正在尝试搜索firstName
和lastName
,然后您可以使用:
NSPredicate *firstNamePredicate=[NSPredicate predicateWithFormat:@"firstName LIKE[cd] %@", @"Jo"];
NSPredicate *lastNamePredicate =[NSPredicate predicateWithFormat:@"lastName LIKE[cd] %@", @"Jo"];
NSPredicate *finalPredicate = [NSCompoundPredicate orPredicateWithSubpredicates : @[firstNamePredicate, lastNamePredicate]];
最终谓词由or
先前的谓词生成。因此,即使Jo
或firstName
中存在lastName
,该Person
对象也会通过谓词测试。
获取具有上述谓词的过滤对象
NSArray *filteredArray = [inputArray filteredArrayUsingPredicate:finalPredicate];