如何通过键中的子字符串过滤 NSDictionary?

Posted

技术标签:

【中文标题】如何通过键中的子字符串过滤 NSDictionary?【英文标题】:How to filter NSDictionary by substring in its keys? 【发布时间】:2014-03-17 16:17:09 【问题描述】:

假设我有一个NSDictionary,它的键是这样的:

    @"123_000" @"223_000" @"123_111" @"223_111"

等等。我想获取对应键包含子字符串@"123" 的所有值的NSArrayNSSet

当然,我可以只循环NSDictionary,但我怀疑一定有一种代码量较少的方法,可能涉及KVCNSPredicate,但我对它们中的任何一个都不是很擅长。

【问题讨论】:

【参考方案1】:

是的,使用NSPredicate

首先从字典中获取allKeys。然后使用filteredArrayUsingPredicate: 获取您想要的密钥列表。然后将objectsForKeys:notFoundMarker: 与生成的键数组一起使用以获取关联的对象(未找到标记不是问题,因为我们知道所有键都存在)。

【讨论】:

【参考方案2】:

更正 VaaChar 的答案:

在我的示例中,我有一个仅包含键和值的字典(素食:1,牛排:2,...)

要检查我的字符串是否在这些键中,我使用:

NSPredicate *predicate  = [NSPredicate predicateWithFormat:@"SELF CONTAINS %@", keyword];
NSArray *categories     = [[self.categoriesAndIDs allKeys] filteredArrayUsingPredicate:predicate];

SELF 表示给定数组的当前对象,在我的例子中是 [self.categoriesAndIDs allKeys] 所以数组中的每个字符串都将检查我的“关键字”,例如“steak”或“st”,结果将是一个包含名为“steak”的字符串的数组。

【讨论】:

【参考方案3】:

你可以这样使用:

NSArray *resultArray = [[mainDict allValues] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self.@allKeys CONTAINS[c] %@", @"123"]];

"self.@allKeys" 应该返回字典的所有键,"CONTAINS[c] %@" 检查键是否包含"123"。

【讨论】:

你试过了吗?据我所知,这是行不通的。您是否输入错误或错过了答案中的某些内容?

以上是关于如何通过键中的子字符串过滤 NSDictionary?的主要内容,如果未能解决你的问题,请参考以下文章

如何过滤包含 Python 中的子字符串的 jsonpath 表达式中的 URL 列表

休眠仅保存具有复合主键中的父外键的子表条目

如何通过文本框过滤数据表视图中的子表单? #likeoperator #where 子句

如何从任何对象键中过滤不区分大小写的对象数组

如何仅从一个键中过滤对象并将其作为 json 返回?

如何通过字符串的子集过滤数据框? [复制]