【问题标题】:Retrieve NSDictionary from NSArray where dictionary key has value X从 NSArray 中检索 NSDictionary,其中字典键的值为 X
【发布时间】:2013-03-27 16:57:21
【问题描述】:

我有一个NSArrayNSDictionaries。一个数组中的一个字典键包含一个值。我想用该值检索NSDictionary

我的数组:

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

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

我怎样才能做到这一点?

【问题讨论】:

  • 您应该可以使用NSPredicateSee similar example here.
  • 谢谢小费。我会将我使用的解决方案添加到答案中

标签: ios objective-c nsarray nsdictionary


【解决方案1】:

以下解决了我的问题:

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

感谢用户 Nate 对我的问题的评论!

【讨论】:

  • 其实这个答案和especially lindinax's answer都比你接受的要好。 Bhargavi 的答案检查一个键 包含 字符串,但您的问题要求一个键等于某个值的结果。一般来说,这两个不是一回事。它可能不会对您的键名产生影响,但对其他人来说却很有可能。
  • 当您要求“不区分大小写”时,您回答自己的问题是错误的。尤其是当您将其设置为已接受时。
  • @lindinax 很公平。我认为我在您之前选择答案的原因主要是因为我在您发布之前发布了它。但是,你是对的,5 年后我现在改了;)
【解决方案2】:

LIKE[cd] 也会这样做

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

返回

<NSArray>(
    {
       DisplayName = PurchaseAmount;
       InternaName = "Number 1";
       NumberValue = 3500;
    }
)

【讨论】:

    【解决方案3】:

    这样使用NSPredicate

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

    这里的过滤器将保存您的字典,其中包含设置为 PurchaseAmount 的 DisplayName(不区分大小写)

    【讨论】:

    • 不错!谢谢你。比我新找到的解决方案更好。
    • 实际上,这不是问题所问的。您的谓词在键 包含 字符串的位置找到匹配项。如果有另一个键是此键名称的超集,则您的过滤器会给出 误报。 (例如DisplayName = "PurchaseAmountWithTax";)
    • 你是对的,尽管 Bhargavi 的解决方案确实有用!
    【解决方案4】:

    用 Swift 回答,

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

    数据 nsarray 是这样的

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

    【讨论】:

      【解决方案5】:
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"DisplayName == 'level'"];
        NSArray *arrOutput = [[Array filteredArrayUsingPredicate:predicate] mutableCopy];
      

      借助以上 2 行,您将获得 DisplayName = "PurchaseAmount" 的所有字典

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-02
        相关资源
        最近更新 更多