以 NSDictionary 作为对象的嵌套数组上的 NSPredicate

Posted

技术标签:

【中文标题】以 NSDictionary 作为对象的嵌套数组上的 NSPredicate【英文标题】:NSPredicate on nested array with NSDictionary as object 【发布时间】:2017-05-02 13:43:40 【问题描述】:

我有一个类似的 NSDictionary:


"2017-05-02" =     (
            
        "always_valid" = 0;
        date = "2017-05-02";
        from = "12:00";
        to = "13:00";
    ,
            
        "always_valid" = 0;
        date = "2017-05-02";
        from = "12:00";
        to = "12:00";
    ,
            
        "always_valid" = 0;
        date = "2017-05-02";
        from = "14:00";
        "hourly_rate" = 12;
        to = "15:00";
    
);
"2017-05-03" =     (
            
        "always_valid" = 0;
        date = "2017-05-03";
        from = "12:00";
        to = "13:00";
    
);
"2017-05-18" =     (
            
        "always_valid" = 1;
        date = "2017-05-18";
        from = "12:00";
        to = "12:00";
    
);

我正在申请

NSPredicate *filter = [NSPredicate predicateWithFormat:@"always_valid = \"1\""];
 NSArray *alwaysvalid = [[dic allValues] filteredArrayUsingPredicate:filter];

当我有类似的结构时它曾经工作过

数组 > 字典

但现在好像

数组 > 数组 > 字典

通过对数组执行 [dic allValues]。 任何帮助我应该申请什么以保持快速。

【问题讨论】:

【参考方案1】:

您需要做的是需要枚举您的字典并创建新的过滤字典。

NSMutableDictionary *filterDic = [[NSMutableDictionary alloc] init];
NSPredicate *filter = [NSPredicate predicateWithFormat:@"always_valid = 1"];
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSArray* obj, BOOL *stop) 
     NSArray *filterArray = [obj filteredArrayUsingPredicate:filter];
     if (filterArray.count > 0) 
         filterDic[key] = filterArray;
     
];

【讨论】:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“ALL 或 ANY 运算符的左侧必须是 NSArray 或 NSSet。” 来自 NSPredicate *filter = [NSPredicate predicateWithFormat:@"ANY always_valid = 1"]; NSArray *alwaysvalid = [[dic allValues] filteredArrayUsingPredicate:filter]; 和“always_valid”将始终为 1 或 0。 @SameerAzeem 你试过使用enumerateKeysAndObjectsUsingBlock 吗? @SameerAzeem 我不明白,因为如果您的字典包含所有值作为数组,这应该可以正常工作【参考方案2】:

试试这个:

 NSArray *array = [NSArray arrayWithObject:dict];   // you can also do same for Name key... 
 NSArray *alwaysvalid = [array filteredArrayUsingPredicate:filter];

【讨论】:

我应该返回 "2017-05-18" = ( "always_valid" = 1; date = "2017-05-18"; from = "12:00"; to = "12: 00";);

以上是关于以 NSDictionary 作为对象的嵌套数组上的 NSPredicate的主要内容,如果未能解决你的问题,请参考以下文章

JSONModel 嵌套字典数组 JSONModel nest NSDictionary NSArray

如何使用 NSDictionary 收集嵌套在数组中的 JSON 数据

iOS NSJSONSerialization 嵌套 NSDictionary 作为 POST 请求序列化时的键

NSDictionary 中的嵌套对象与 RestKit

如何在 NSDictionary 中为键和对象添加数组

azure arm模板嵌套数组作为参数