使用 NSPredicate 过滤包含字典的数组数组
Posted
技术标签:
【中文标题】使用 NSPredicate 过滤包含字典的数组数组【英文标题】:Filtering an array of arrays that contain a dictionary using 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 个对象。我不明白为什么会这样。我在这里查看问题,他们只有一个字典数组,但找不到嵌套数组。希望您能帮忙,谢谢!
【问题讨论】:
你必须做一个深度搜索,因为它是一个多级数组 我希望返回的结构与原始结构相同 - 仍然是数组中字典的数组。如何进行深度搜索? 【参考方案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 语句。非常感谢你们俩!这是拼图的最后一块,现在我的搜索工作很完美,今晚我可能会得到一些急需的休息。 :)以上是关于使用 NSPredicate 过滤包含字典的数组数组的主要内容,如果未能解决你的问题,请参考以下文章
在iOS中的字典中使用字典数组的NSPredicate进行过滤