2013-05-02 103 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