NSDictionary 的 NSArray 过滤和 NSDictionary
Posted
技术标签:
【中文标题】NSDictionary 的 NSArray 过滤和 NSDictionary【英文标题】:Filter and NSDictionary of NSArray of NSDictionary's 【发布时间】:2013-05-02 15:16:01 【问题描述】:我有一个 NSDictionary,其中包含大约 150 个锅炉制造商的关键字。每个键的值是 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);
【讨论】:
更简单的方法是NSArray *filteredArray = [[boilerData valueForKeyPath:@"allValues.@unionOfArrays"] filteredArrayUsingPredicate:predicate]
。
@Chuck 感谢代码。我已将其合并到解决方案中,但是我必须这样做 [[boilerData allValues] valueForKeyPath:@"@unionOfArrays.@self"];让它工作。我不知道为什么 [boilerData valueForKeyPath:@"allValues.@unionOfArrays.@self"];被窃听了。
@markpirvine: 哦,它不像我写的那样工作,因为 NSDictionary 处理valueForKey:
的方式——它是objectForKey:
的垫片。我真傻,忘了这一点。
@Chuck 真可惜!这将是一种非常好的方法来消化带有字典的层次结构。以上是关于NSDictionary 的 NSArray 过滤和 NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章
使用特定键的值过滤 NSDictionary 的 NSArray
如何通过键过滤 NSArray:值,即在 NSDictionary
使用 NSDictionary 按 int 值过滤 NSArray
使用 NSPredicate 根据 NSDictionary 键过滤 NSArray