2013-05-02 121 views
0

我有一个NSDictionary包含一些锅炉制造商的150个关键。每个键的值是一个NSDictionary的NSArray。每一个的NSDictionary代表的一些性质锅炉:NSDictionary的NSArray的过滤器和NSDictionary的

NSDictionary boilerData = 
{ 
    @"Alpha" = [{name: Boiler1, rating: 80}, {name:Boiler2, rating: 90}], 
    @"Beta" = [{name: Boiler3, rating: 80}, {name:Boiler4, rating: 91}, {name:Boiler5, rating: 78}], 
    ... 
} 

我希望能够过滤,这样我可以得到所有锅炉有一个等级的80.我知道我需要一个NSPredicate,但我不能弄清楚如何构建它?我发现的其他文章都不符合这个要求。

回答

1
NSDictionary *boilerData = 
@{ 
    @"Alpha" : @[@{@"name": @"Boiler1", @"rating": @80}, @{@"name": @"Boiler2", @"rating": @90}], 
    @"Beta" : @[@{@"name": @"Boiler3", @"rating": @98}, @{@"name": @"Boiler4", @"rating": @80}, @{@"name": @"Boiler5", @"rating": @90}] 
    }; 

NSMutableArray *filteredArray = [[NSMutableArray alloc] init]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"rating = 80"]; 
for (NSArray *array in [boilerData allValues]) { 
    [filteredArray addObjectsFromArray:[array filteredArrayUsingPredicate:predicate]]; 
} 
NSLog(@"all boilers with rating = 80 : %@", filteredArray); 
+2

这样做的更简单的方法是NSArray * filteredArray = [[boilerData valueForKeyPath:@“allValues。@ unionOfArrays”] filteredArrayUsingPredicate:predicate]'。 – Chuck 2013-05-02 18:18:26

+1

@Chuck感谢您的代码。我已经将它整合到解决方案中,但是我必须做[[boilerData allValues] valueForKeyPath:@“@ unionOfArrays。@ self”];让它起作用。我不知道为什么[boilerData valueForKeyPath:@“allValues。@ unionOfArrays。@ self”];窃听了。 – markpirvine 2013-05-02 20:48:40

+2

@markpirvine:D'oh,它不会像我写的那样工作,因为NSDictionary如何处理'valueForKey:' - 它是'objectForKey:'的填充。愚蠢的我忘记了。 – Chuck 2013-05-02 20:53:34