2013-04-05 57 views
9

我有NSArrayNSDictionaries。其中一个数组中的一个字典键包含一个值。我想用该值检索NSDictionary从NSArray中检索NSDictionary,其中字典键具有值X

我的数组:

Array: (
     { 
     DisplayName = "level"; 
     InternalName = "Number 2"; 
     NumberValue = 1; 
    }, 
     { 
     DisplayName = "PurchaseAmount"; 
     InternalName = "Number 1"; 
     NumberValue = 3500; 
    } 
) 

所以,我想获得它包含DisplayName设置为PurchaseAmount(不区分大小写)的字典。

我该如何做到这一点?

+3

您应该能够使用'NSPredicate'了点。 [在这里看到类似的例子](http://stackoverflow.com/q/958622/119114)。 – Nate 2013-04-05 10:13:59

+0

Thnx的小费。我会将我用过的解决方案添加到答案 – 2013-04-05 10:17:01

回答

17

下面的解决我的问题:

NSArray *filtered = [promotions filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(DisplayName == %@)", @"PurchaseAmount"]]; 
NSDictionary *item = [filtered objectAtIndex:0]; 

日Thnx到用户Nate对我的问题发表评论!

+3

其实,这个答案和[特别是lindinax的回答](http://stackoverflow.com/a/15831638/119114)都比你接受的更好。 Bhargavi的答案检查一个键*包含*字符串,但是您的问题要求键与某个值相等的结果。一般来说,这两个不是一回事。这对您的关键名称可能没有什么不同,但对于其他人来说,它可以做得很好。 – Nate 2013-04-05 21:01:38

+0

当您要求输入“不区分大小写”时,您正在回答自己的问题。特别是当你把它设定为接受的。 – lindinax 2014-01-17 16:24:25

5

使用NSPredicate这样

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"DisplayName LIKE[cd] 'PurchaseAmount' "]; 
NSArray *filter = [array filteredArrayUsingPredicate:predicate]; 
NSLog(@"%@",filter); 

这里过滤器会牵着你的字典包含显示名称设置为PurchaseAmount(不区分大小写)

+0

好!谢谢。最好是我最近找到的解决方案。 – 2013-04-05 10:20:10

+0

实际上,这不是**问题。您的谓词查找匹配**包含**字符串的位置。如果还有另一个密钥是此密钥名称的超集,则您的过滤器会给出* false positive *。 (例如'DisplayName =“PurchaseAmountWithTax”';) – Nate 2013-04-05 20:58:07

+0

即使Bhargavi的解决方案确实有用,你是对的! – 2013-04-09 10:44:38

9

LIKE [CD]也会做

NSArray *filtered = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(DisplayName LIKE[cd] %@)", @"purchaseAmount"]]; 

返回

<NSArray>(
    { 
     DisplayName = PurchaseAmount; 
     InternaName = "Number 1"; 
     NumberValue = 3500; 
    } 
) 
0
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"DisplayName == 'level'"]; 
    NSArray *arrOutput = [[Array filteredArrayUsingPredicate:predicate] mutableCopy]; 

的帮助的2行以上,你会得到所有的字典,显示名称= “PurchaseAmount”

3

回答Swift,

let predicate = NSPredicate(format: "name contains[cd] %@", stringLookingFor) 
let newList = data .filteredArrayUsingPredicate(predicate) 

数据的NSArray像这样

[ 
{ 
    name = Carlos, 
    total = 9 
}, 
{ 
    name = Willy, 
    total = 2 
} 
]