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

更新/更改存储在 NSArray 中的 NSDictionary 键的值

如何使用 NSPredicate 过滤 NSArray