NSMutableArray和NSPredicate过滤

我试图过滤我的数组中的两个实体,如我有一个Person对象,其中我有姓名,地址,号码,电子邮件等我试图过滤我的对象名称和数字的对象数组列表。 如何使用NSPredicate来实现?

创build谓词(以下假定您的Person类具有namenumberstring属性):

 NSString *nameFilter = @"Steve*"; NSString *numberFilter = @"555-*"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name like %@) or (number like %@)", nameFilter, numberFilter]; 

然后,过滤数组(假定你有一个NSArrayPerson对象):

 NSArray *personArray = /* obtain from somewhere */; NSArray *filtered = [personArray filteredArrayUsingPredicate:pred]; 

结果将是一个包含Person对象的数组,其name可以是“Steve”,“Steven”等,其编号以555-

编辑

你所说的话没有意义。 你不能从一个类中删除属性(或者说,你不应该 )。 如果你只是想要一个只包含名字和数字的数组,你必须遍历Person对象的数组:

 NSMutableArray *result = [NSMutableArray array]; for (Person *p in personArray) [result addObject:[NSString stringWithFormat:"%@ : %@", [p name], [p number]]]; 

我相信你正在寻找:

 NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name==%@",name]; 

或者如果你想要string名称的相似性,你也可以使用:

 NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name like %@",name]; 

并假设电话号码只是一个整数,你可以使用==,<,<=等等进行号码比较

然后将其应用于:

 NSArray * filteredarray = [array filteredArrayUsingPredicate:predicate]; 

我更喜欢使用CONTAINS字进行过滤。 做这个工作很容易。 或者你可以把它们结合在一起:

 NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@ OR name LIKE[cd] %@", filterName, filterName]; 

你可以参考官方DOC :

开始:左手expression从右手expression开始。

包含:左边的expression式包含右边的expression式。

完成:左手expression式以右手expression式结束。

喜欢:左手expression等于右手expression: 和*允许作为通配符,在哪里? 匹配1个字符,*匹配0个或更多字符。

匹配:根据ICU v3,左手expression式使用正则expression式比较等于右手expression式(更多细节参见ICU用户指南中的正则expression式)。

 NSPredicate *pNewsCard = [NSPredicate predicateWithFormat:@"feedType = %@", @"NewsCard"]; NSArray *filteredNewsCard = [arrayTotalFeed filteredArrayUsingPredicate:pNewsCard]; 

feedType是要比较的Custom对象的属性, arrayTotalFeed是Custom对象的数组。