7

キーを持ついくつかの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" : @{...}
    }];
}
4

4 に答える 4

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];

これは、「Eric Johnson」辞書を含む配列を返します。

NSComparisonPredicateあらゆる種類の複雑なマッチングを行うときにお勧めします。修飾子、タイプ、およびオプションのオプションを見てください。そこには、正規表現や大文字と小文字を区別しないなど、優れた組み込みのマッチングエンジンがいくつかあります。とにかく、ここではおそらく必要ないので、次のように置き換えることができます。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K = %@", keyPath, valueIAmLookingFor];

最初の結果のみを気にする場合は、keyPath/述語ビジネスを完全にスキップできます。

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

return nil;
于 2012-11-06T17:13:46.840 に答える
5

を使用しNSPredicateて配列をフィルタリングできます。次のようなもの:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"phoneNumbers.keyIAmLookingFor == %@", @"valueIAmLookingFor"];
NSArray *matches = [addressBookPhoneIndividuals filteredArrayUsingPredicate:predicate];
于 2012-11-06T16:23:11.447 に答える
1

配列をどのようにフィルタリングしたいのかよくわかりませんが、私がよく使用する単純なアプローチの 1 つは、ブロックベースのフィルタリングです。

NSIndexSet* filteredIndexes = [addressBookPhoneIndividuals indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop){
    NSString *name = [obj objectForKey:@"name"];
    NSString *ID = [obj objectForKey:@"ID"];
    NSDictionary *phoneNumbersDict = [obj objectForKey:@"phoneNumbersDict"];

    return [[phoneNumbersDict objectForKey:@"keyIAmLookingFor"] isEqualToString:@"valueIAmLookingFor"];
}];

NSArray* filteredArray = [addressBookPhoneIndividuals objectsAtIndexes:filteredIndexes];

これは役に立ちますか?

于 2012-11-06T14:46:00.920 に答える
0

使用できます

i.     –allKeysForObject:
ii.    –objectForKey:
iii.   –valueForKey:
iv.    –keysOfEntriesPassingTest:
v.     –keysOfEntriesWithOptions:passingTest:

NSPredicateFilter を使用することもできます。

于 2012-11-06T14:26:12.057 に答える