2013-03-04 149 views
0

我正在一个项目中,我正在下载一大堆JSON,然后制作一个漂亮的UITableView。NSPredicate过滤NSMutableArray子NSDictionaries

我已经把JSON解析成了一个很好的NSMutableArray,然后将它提供给UITableView。一切正常,看起来很漂亮。

我遇到的问题是我的NSMutableArray中有一个字典对象,我想用它来执行tableview的过滤。

这是在的NSMutableArray对象的NSLog的,我正在看:

{ 
id = 123456; 
    issues =  (
       { 
      id = 4; 
      name = "Ape"; 
     }, 
       { 
      id = 25; 
      name = "Chimp"; 
     }, 
       { 
      id = 28; 
      name = "Human"; 
     } 
    ); 
status = open; 
} 

我想写一个谓词过滤器上的任何问题的名称列的字典中的NSMutableArray 。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"name", @"Human"]; 
NSArray *predicateFilteredArray = [tableViewArray filteredArrayUsingPredicate:predicate]; 

但是我找不出合适的格式来匹配问题中名称的谓词变量。我已经阅读并重读了Predicate Programming指南,大约有一半的堆栈溢出项标记为NSPredicate,我无法弄清楚语法。 我已经尝试了很多变体的自我,我只是普通老卡住了。

+0

我的回答有帮助吗?如果您需要更多信息,请告诉我。 – 2013-03-06 08:35:17

回答

2

如果我理解正确的问题,下面的谓语应该工作:

[NSPredicate predicateWithFormat:@"ANY issues.name == %@", @"Human"] 

这给从那里的“问题”至少一个有一个“名字”,这等于“阵列中的所有对象人”。

+0

我试过这个解决方案,但它没有为我工作。你可以请检查我做了什么错误[这里](http://stackoverflow.com/questions/26480703/filtering-nsmutablearray-of-nsdictionary-with-nspredicate)? – NAZIK 2014-10-21 07:19:43

0

我写了一个类别方法库,名为Linq to ObjectiveC,这使得这种事情更容易一些。从我可以收集的信息中可以看到,有一系列物品,每个物品都有一个名为issues的属性,它本身就是一个数组?

如果你想找到所有已命名为“人”的问题的项目,您可以执行以下操作:

NSArray* matches = [inputArray where:^BOOL(id item) { 
    return [[item issues] any:^BOOL(id issue) { 
     return [[issue name] equalTo:@"Human"]; 
    }]; 
}] 

它使用LINQ到的ObjectiveC whereany方法。