这是可能的,但以迂回的方式。我建议您考虑使用不同的方法。
话虽如此,这就是你的做法:
NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:
[NSArray arrayWithObjects:@"a", @"b", @"c", nil], @"a",
[NSArray arrayWithObjects:@"b", @"c", @"a", nil], @"b",
[NSArray arrayWithObjects:@"c", @"a", @"b", nil], @"c",
[NSArray arrayWithObjects:@"a", @"b", @"c", nil], @"d",
nil];
NSPredicate *p = [NSPredicate predicateWithFormat:@"%@[SELF][0] == 'a'", d];
NSLog(@"%@", p);
NSArray *keys = [d allKeys];
NSArray *filteredKeys = [keys filteredArrayUsingPredicate:p];
NSLog(@"%@", filteredKeys);
NSDictionary *matchingDictionary = [d dictionaryWithValuesForKeys:filteredKeys];
NSLog(@"%@", matchingDictionary);
这是怎么回事:
我们有我们的源字典,d。这是一个字典,其中一个字母(a、b、c 或 d)被键入一个数组。我们将找到与第一个元素为a 的数组对应的所有键。
我们的谓词是:
[NSPredicate predicateWithFormat:@"%@[SELF][0] == 'a'", d];
这里我们在源字典上使用索引运算符。 SELF,在评估此谓词时,将是 d 的 键 之一。所以%@[SELF] 会返回一个数组。然后我们获取该数组的第 0 个元素并将其与字符串 a 进行比较。如果匹配,则返回YES。
然后我们抓取字典中的所有键并使用该谓词过滤它们。这意味着结果数组将仅包含对应数组的第一个元素为a 的键。
一旦我们有了匹配的键,我们就会从源字典中提取一个“子字典”来得到最终的精简字典。
在上面的测试中,matchingDictionary 有两个键(a 和 d),它们都被键控到包含 (a, b, c) 的数组。
如果您想要一个包含匹配数组的NSArray,则可以改用-[NSDictionary objectsForKeys:notFoundMarker:]。
但是,这是一个尴尬的解决方案,我仍然认为您应该重新组织数据。