【问题标题】:Filtering an array of arrays that contain a dictionary using NSPredicate使用 NSPredicate 过滤包含字典的数组数组
【发布时间】:2014-04-14 04:43:10
【问题描述】:

我有一个名为 charactersAndDescriptions 的数组,其中包含多个数组,每个数组中都有一个 NSDictionary,其中包含两个键/值。它看起来像这样:

我需要根据键“desc”的值过滤此数组,将其与字符串变量 searchText 进行比较(并且它应该返回该字符串存在于 desc 中任何位置的结果)。我希望返回的结构与原始结构相同 - 数组在数组中包含字典。这是我的代码:

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"desc contains[c] %@", searchText];
self.resultsArray = [self.charactersAndDescriptions filteredArrayUsingPredicate:resultPredicate];

问题是,self.resultsArray 总是返回 0 个对象。我不明白为什么会这样。我在这里查看问题,他们只有一个字典数组,但找不到嵌套数组。希望您能帮忙,谢谢!

【问题讨论】:

  • 你必须做一个深度搜索,因为它是一个多级数组
  • 我希望返回的结构与原始结构相同 - 仍然是数组中字典的数组。如何进行深度搜索?

标签: ios objective-c nsarray nsdictionary nspredicate


【解决方案1】:

我不确定您是否可以使用单个谓词来做到这一点。但是您可以遍历各个字典数组,过滤它们并将过滤后的列表添加到最终数组中。试试这样的:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"desc contains[c] %@", searchText];
NSMutableArray *finalColletion = [NSMutableArray array];
for (NSArray *temp in self.charactersAndDescriptions) {
    NSArray *result =[temp filteredArrayUsingPredicate:predicate];
    if([result count] > 0) {
        [finalColletion addObject:result];
    }
}

【讨论】:

  • +1 但检查[result count] > 0 将阻止您的代码生成与输入数组匹配的输出数组。不需要检查,因为filteredArrayUsingPredicate 将在没有匹配项时返回一个有效的空数组。
  • 'filteredArrayUsingPredicate' 如果没有匹配项,将返回一个空数组。无需将其添加到最终结果数组中。因此检查..为什么它会从生成输出数组开始?它将生成有效的输出数组
  • 除非结果数组包含空数组,否则顶级数组索引将不匹配,但这可能会或可能不重要,具体取决于他如何使用结果数组。
  • 这确实很重要,实际上只是为了在填写数据源方法时稍微简化代码,所以我确实删除了那个 if 语句。非常感谢你们俩!这是拼图的最后一块,现在我的搜索工作很完美,今晚我可能会得到一些急需的休息。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 2015-07-02
  • 2013-06-18
  • 1970-01-01
相关资源
最近更新 更多