NSMutableArray and NSPredicate filtering



我正在尝试使用对象中的两个实体过滤我的数组,例如我有一个 Person 对象,其中我有姓名、地址、号码、电子邮件等。我正在尝试仅使用名称和编号过滤我的对象数组列表。如何使用 NSPredicate 实现这一点?

创建谓词(下面假定您的 Person 类具有 namenumber字符串属性(:

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

然后,筛选数组(这假设您有Person对象的NSArray(:

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

结果将是一个包含Person对象的数组,这些对象的name可以是"史蒂夫"、"史蒂文"等,其编号以 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];

或者,如果您希望字符串名称相似,也可以使用:

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];

您可以参考官方文档:

开头:左手表达式以右手表达式开头。

包含

:左侧表达式包含右侧表达式。

结束:左手表达式以右手表达式结束。

LIKE:左手表达式等于右手表达式:? 和 * 允许作为通配符,其中 ? 匹配 1 个字符,* 匹配 0 个或多个字符。

MATCHES:根据 ICU v3 使用正则表达式样式比较,左手表达式等于右手表达式(有关更多详细信息,请参阅 ICU 正则表达式用户指南(。

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

feedType 是要比较的自定义对象的属性,arrayTotalFeed是自定义对象的数组。

最新更新