如何过滤NSDictionarys和NSDictionarys的数组?

Pet*_*rbo 7 cocoa objective-c nsdictionary nspredicate

我有一个数组,其中包含几个带有键的NSDictionaries:

  • NSString *name
  • NSString *ID
  • NSDictionary *phoneNumbersDict

现在我想过滤此数组以找到具有phoneNumbersDict@"keyIAmLookingFor"和值的数组@"valueIAmLookingFor".

NSMutableArray *addressBookPhoneIndividuals = [NSMutableArray array];
for (int i = 0; i < x; i++) {
    [addressBookPhoneIndividuals addObject:@{
        @"name" : @"...",
        @"ID" : @"...",
        @"phoneNumbers" : @{...}
    }];
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*her 6

NSString *keyIAmLookingFor = @"work";
NSString *valueIAmLookingFor = @"444-567-9019";

NSArray *addressBookPhoneIndividuals = @[
    @{
        @"name" : @"Mike Rowe",
        @"ID" : @"134",
        @"phoneNumbers" : @{
            @"work" : @"123-456-8000",
            @"school" : @"647-5543",
            @"home" : @"123-544-3321",
        }
    },
    @{
        @"name" : @"Eric Johnson",
        @"ID" : @"1867",
        @"phoneNumbers" : @{
            @"work" : @"444-567-9019",
            @"other" : @"143-555-6655",
        }
    },
    @{
        @"name" : @"Robot Nixon",
        @"ID" : @"-12",
        @"phoneNumbers" : @{
            @"work" : @"123-544-3321",
            @"school" : @"123-456-8000",
            @"home" : @"444-567-9019",
        }
    },
];

NSString *keyPath = [@"phoneNumbers." stringByAppendingString:keyIAmLookingFor];

NSPredicate *predicate =
[NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionForKeyPath:keyPath]
                                   rightExpression:[NSExpression expressionForConstantValue:valueIAmLookingFor]
                                          modifier:NSDirectPredicateModifier
                                              type:NSEqualToPredicateOperatorType
                                           options:0];

NSArray *result = [addressBookPhoneIndividuals filteredArrayUsingPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)

这将返回一个包含"Eric Johnson"字典的数组.

我喜欢NSComparisonPredicate在进行任何复杂匹配时推荐.查看修改器,类型和选项的选项.那里有一些很好的内置匹配引擎 - 包括正则表达式和不区分大小写.无论如何,这里可能没有必要,所以你可以替换以下内容:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K = %@", keyPath, valueIAmLookingFor];
Run Code Online (Sandbox Code Playgroud)

如果您只关心第一个结果,则可以完全跳过keyPath /谓词业务:

for (NSDictionary *individualDict in addressBookPhoneIndividuals) {
    NSDictionary *phoneNumbers = [individualDict objectForKey:@"phoneNumbers"];
    NSString *possibleMatch = [phoneNumbers objectForKey:keyIAmLookingFor];
    if ([possibleMatch isEqualToString:valueIAmLookingFor]) {
        return individualDict;
    }
}

return nil;
Run Code Online (Sandbox Code Playgroud)


All*_*ian 5

您可以使用an NSPredicate来过滤数组.类似于以下内容:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"phoneNumbers.keyIAmLookingFor == %@", @"valueIAmLookingFor"];
NSArray *matches = [addressBookPhoneIndividuals filteredArrayUsingPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)