我有NSArray的NSArray。
字典有这样的键:颜色,数字,代码,描述和大小。
现在我有了一个键,我想在数组中找到那个字典,一些神奇的命令如:
NSDictionary *oneDict = [get a dictionary from myArray where "code" is equal to "32"];
代码是一个键,32是一个值。
我知道如何枚举数组并逐个搜索每个字典,但我知道objective-c是一个装满“技巧”的包,并且可能存在一个“魔术命令”来从数组中手动提取这个字典线。
任何线索?
答案 0 :(得分:2)
您可以使用indexOfObjectPassingTest来获取对象索引:
NSUInteger index = [myArray indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
NSDictionary* dict = obj;
return [obj[@"code"] intValue] == 32;
}];
如果没有找到,结果将是NSNotFound;
答案 1 :(得分:1)
如果您打算多次进行查找并且不介意花一些时间进行设置,则可以创建一个字典,将code
的值映射到包含这些值的字典。即:
NSDictionary * mapping = [ NSDictionary dictionaryWithObjects:myArray forKeys:[ myArray valueForKey:@"code" ] ]
id answer = mapping[@"32" ] ;
仅当code
包含唯一值时才有效。如果值不是唯一的:
NSArray * codeValues = [ myArray valueForKey:@"code" ] ;
NSIndexSet indexes = [ codeValues indexesOfObjectsPassingTest:^BOOL(id object){ [ object isEqual:@"32" ] } ] ;
NSArray * matchingDictionaries = [ myArray objectsAtIndexes:indexes ] ;
matchingDictionaries
将是一个包含code
为@"32"
的词典的数组。
将这些示例中的@"32"
替换为您希望找到的code
的值,& c。
答案 2 :(得分:1)
这可以通过更简单的NSPredicate完成:
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"code MATCHES[cd] %@", value];
NSArray *result = [myArray filteredArrayUsingPredicate:predicate];
结果数组将保存与该值匹配的所有NSDictionaries。 看看NSPredicate documentation 它非常强大