通过键搜索字典数组的数组

时间:2014-10-09 12:52:58

标签: ios cocoa-touch nsarray nsdictionary nspredicate

我有这样的词典

  NSDictionary *dictA = @{ @"name" : @"John",
                           @"city" : @"Los Angeles" };

  NSDictionary *dictB = @{ @"name" : @"Bob",
                           @"city" : @"Los Angeles" };

  NSDictionary *dictC = @{ @"name" : @"Carl",
                           @"city" : @"Dallas" };

像这样的许多词典被城市分开并放入其他词典中,如

  NSArray *losAngeles = @[ dictA, dictB, ....];

  NSArray *dallas = @[ dictC, ... ];

并且所有内容都在数组

self.arrayAll = @[losAngeles, dallas, miami... ];

现在更好的部分,我想得到一个包含名为Bob的人的字典(假设所有名称都是唯一的)。

如果那是一系列的dicts我会这样做

  NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name BEGINSWITH[cd] %@)", @"Bob"];
  NSarray *filteredNames = [self.arrayAll filteredArrayUsingPredicate:pred];

但是因为arrayAll是一个dicts数组的数组,所以这不适用于以下错误:

***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'无法使用非字符串的内容执行子字符串操作????

任何线索?

2 个答案:

答案 0 :(得分:1)

为什么不进行快速枚举? 类似的东西:

for (NSArray *cityArray in self.arrayAll) {

   for (NSDictionary *cityDictionary in cityArray) {

    if ([[cityDictionary valueForKey:@"name"] isEqualToString:@"Bob"]) {
      //do something
    }

  }

}

答案 1 :(得分:1)

我做这样的事情......

NSMutableArray *results = [NSMutableArray array];

[citiesArray enumerateObjectsUsingBlock:^(NSArray *dictArray, NSUInteger idx, BOOL *stop) {
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name BEGINSWITH[cd] %@)", @"Bob"];
    NSArray *filteredNames = [self.arrayAll filteredArrayUsingPredicate:pred];

    [results addObjectsFromArray:filteredNames];
}];

您可以像这样添加并发选项......

[citiesArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSArray *dictArray, NSUInteger idx, BOOL *stop) {
    //stuff...
}];

让它同时运行。我不知道结果数组如何处理它。试一试。

这将利用所有步骤的快速枚举和并发。