【问题标题】:Filter and NSDictionary of NSArray of NSDictionary'sNSDictionary 的 NSArray 过滤和 NSDictionary
【发布时间】: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,但我不知道如何构建它?我发现的其他文章似乎都不符合这个要求。

【问题讨论】:

    标签: objective-c nsarray nsdictionary


    【解决方案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 真可惜!这将是一种非常好的方法来消化带有字典的层次结构。
    猜你喜欢
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    相关资源
    最近更新 更多