很多NSDictionary的NSArray.找到具有给定密钥所需值的NSDictionary的最佳方法是什么?

Mic*_*ael 6 iphone xcode objective-c ios

现在我正在尝试以下它,它的工作原理.


    - (void)findDictionaryWithValueForKey:(NSString *)name {

         for (NSDictionary * set in myArray) {

            if ([[set objectForKey:@"title"] isEqualToString:name]) 
               \\do something

         }

    }
Run Code Online (Sandbox Code Playgroud)

编辑: 我在bshirley的帖子中添加了一个额外的参数.现在它看起来更灵活.



- (NSDictionary *)findDictionaryWithValue:(NSString*)name forKey:(NSString *)key {

    __block BOOL found = NO;
    __block NSDictionary *dict = nil;

    [self.cardSetsArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        dict = (NSDictionary *)obj;
        NSString *title = [dict valueForKey:key];
        if ([title isEqualToString:name]) {
            found = YES;
            *stop = YES;
        }
    }];

    if (found) {
        return dict;
    } else {
        return nil;
    }

}
Run Code Online (Sandbox Code Playgroud)

Dee*_*olu 8

使用filteredArrayUsingPredicate:数组的方法来获取满足您要求的所有字典.

NSPredicate * predicate = [NSPredicate predicateWithFormat:@" title MATCHES[cd] %@", name];
NSArray * matches = [myArray filteredArrayUsingPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)

现在matches是具有title等于键的字典数组name.


bsh*_*ley 8

这是使用较新API的一种可能实现.(我还修改了实际返回值的方法).主要提供用于演示API.假设标题对于数组中的一个字典是唯一的.

- (NSDictionary *)findDictionaryWithValueForKey:(NSString *)name {
  // ivar: NSArray *myArray;
  __block BOOL found = NO;
  __block NSDictionary *dict = nil;

  [myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    dict = (NSDictionary *)obj;
    NSString *title = [dict valueForKey:@"title"];
    if ([title isEqualToString:name]) {
      found = YES;
      *stop = YES;
    }
  }];

  if (found) {
    return dict;
  } else {
    return nil;
  }

}
Run Code Online (Sandbox Code Playgroud)