获取在数组中具有特定键的NSDictionary

时间:2014-01-28 22:37:56

标签: ios iphone cocoa-touch nsarray nsdictionary

我有NSArray的NSArray。

字典有这样的键:颜色,数字,代码,描述和大小。

现在我有了一个键,我想在数组中找到那个字典,一些神奇的命令如:

NSDictionary *oneDict = [get a dictionary from myArray where "code" is equal to "32"];

代码是一个键,32是一个值。

我知道如何枚举数组并逐个搜索每个字典,但我知道objective-c是一个装满“技巧”的包,并且可能存在一个“魔术命令”来从数组中手动​​提取这个字典线。

任何线索?

3 个答案:

答案 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 它非常强大