过滤其他 NSDictionary 中的 NSDictionary

Posted

技术标签:

【中文标题】过滤其他 NSDictionary 中的 NSDictionary【英文标题】:Filter NSDictionary that in other NSDictionary 【发布时间】:2013-03-12 10:49:57 【问题描述】:

我有一个字典,其中包含从解析 JSON 中提取的其他字典中的子项。 结构如下:

    
        children =             (
                            
                children =                     (
                                            
                        hasArticles = 1;
                        hasWideIcon = 0;
                        label = biological;
                        urlId = 9950000123891;
                    ,
                                            
                        hasArticles = 1;
                        hasWideIcon = 0;
                        label = White;
                        urlId = 9950000123892;
                    ,
                                            
                        hasArticles = 1;
                        hasWideIcon = 0;
                        label = "various flavors";
                        urlId = 9950000123893;
                    ,
                                            
                        hasArticles = 1;
                        hasWideIcon = 0;
                        label = "different tastes creamy";
                        urlId = 9950000123894;
                    ,
                                            
                        hasArticles = 1;
                        hasWideIcon = 0;
                        label = "yogurt drinks";
                        urlId = 9950000123895;
                    ,
                                            
                        hasArticles = 1;
                        hasWideIcon = 0;
                        label = "Yogurt mix";
                        urlId = 9950000123896;
                    ,
                                            

                );
                hasArticles = 0;
                hasWideIcon = 0;
                label = "types of yogurt"; //those above are the children of the "types of yogurt" 
                urlId = 9950000123890;
            ,


                            
                children =                     (
                                            
                        hasArticles = 1;
                        hasWideIcon = 0;
                        label = White;
                        urlId = 9950000123906;
                    ,
                                            
                        hasArticles = 1;
                        hasWideIcon = 0;
                        label = "various flavors";
                        urlId = 9950000123907;
                    ,

                                            
                        hasArticles = 1;
                        hasWideIcon = 0;
                        label = Pappareale;
                        urlId = 9950000123909;
                    
                );
                hasArticles = 0;
                hasWideIcon = 0;
                label = "yogurt healthy"; //those above are the children of the yogurt healthy 
                urlId = 9950000123905;
            ,

                            
                hasArticles = 1;
                hasWideIcon = 0;
                label = "puddings and creams";
                urlId = 9950000123911;
            ,
                            
                hasArticles = 1;
                hasWideIcon = 0;
                label = "Snack dessert";
                urlId = 9950000123913;
            ,
                            
                hasArticles = 1;
                hasWideIcon = 0;
                label = "various Dessert";
                urlId = 9950000123914;
            
        );
        hasArticles = 0;
        hasWideIcon = 0;
        label = "Yogurt and Dessert ";
        urlId = 9950000123889;
    ,

我的代码

 -(void)connectionDidFinishLoading:(NSURLConnection *)connection

        NSLog(@"%d", [webData length]);

       NSString *strResult =[[NSString alloc]initWithData:webData encoding:NSUTF8StringEncoding];
       NSDictionary *result =[strResult JSONValue];
           for (id obj in result)
                  NSLog(@"%@", result);
                  /*A part of the result is written above, but in reality is much 
                    longer and includes all possible products in a supermarket*/

           

   

如何提取“yogurtDessert”的孩子

酸奶的种类(有小孩的) yogurt-healty(有孩子的) 布丁和面霜(不含儿童) 点心甜点(不含儿童) 各种甜点(不含儿童)

那么我怎么提取到不知道提前知道的yogurtDessert的孩子们的孩子们呢?

我需要创建一个包含超市产品类别的字典数组(在这个例子中只有酸奶和甜点,总共 23 个元素),然后我必须创建另一个字典数组,每个字典都包含每个产品,即数千。我考虑过使用 NSPredicate ,但它是字典。 我必须过滤其他字典中的字典

【问题讨论】:

你好混淆你到底想要什么? 你想如何在 UI 中呈现这个结构?您仍然可以使用 NSPredicate 使用“urlId”过滤掉。但是如果你能创建一个像“Category”这样的自定义类会更好。 【参考方案1】:

字典的层次结构似乎包含两种类型的字典:代表类别的字典和产品字典。

我在这里猜测叶子字典(没有子字典)总是产品。具有 children 键的字典始终是类别。这可能不是真的——看起来hasArticles 是 1 代表产品,0 代表类别——但同样,这是未知的。

这是提取所有产品的代码:

static void collectProducts(NSDictionary *dictionary, NSMutableArray *results)

    NSArray *children == dictionary[@"children"];

    if (children == nil) 
        [results addObject:dictionary];
        return;
    

    for (NSDictionary *subDict in children)
        collectProducts(subDict, results);


NSArray *findProducts(NSDictionary *dictionary)

    NSMutableArray *result = [NSMutableArray array];
    collectProducts(dictionary, result);
    return array;

使用您的 JSON result 调用 findProducts 以获取所有叶字典。

【讨论】:

以上是关于过滤其他 NSDictionary 中的 NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章

JSON 和嵌套的 NSDictionary

如何修复错误无法将 [NSDictionary] 快速转换为 NSDictionary?

使用具有多个值的键创建 NSDictionary

如何通过键中的子字符串过滤 NSDictionary?

使用 NSPredicate 过滤 NSDictionary 中的值并返回键数组

使用 NSAttributedString 更改字符串的颜色和字体