【问题标题】:create array which is filtered from array of dictionary with the array as a input创建从字典数组中过滤出来的数组,数组作为输入
【发布时间】:2014-03-13 13:19:19
【问题描述】:

我有一个字典和一个数组,如下所示

字典:

{
    "value": [
        {
            "ctgid": "1",
            "catename": "tow"
        },
        {
            "ctgid": "2",
            "catename": "towrequest"
        },
        {
            "ctgid": "3",
            "catename": "electrical"
        },
        {
            "ctgid": "5",
            "catename": "plumber"
        },
        {
            "ctgid": "6",
            "catename": "maintenance"
        },
        {
            "ctgid": "7",
            "catename": "home"
        },
        {
            "ctgid": "8",
            "catename": "computer"
        },
        {
            "ctgid": "9",
            "catename": "1q2w"
        }
    ]
}

类别名称数组:

(
tow,
towrequest,
plumber
)

Array中有一个catename的列表。从上面的字典中我想在上面的数组中创建与catename相关的ctgid数组。

所以我的最终输出应该是:

catgid 数组:

(
1,
2,
5
)

注意:我可以用 loop 做到这一点,但我不想使用任何循环。

【问题讨论】:

  • 你希望如何在不使用循环的情况下在数组中查找对象?没有其他方法可以找到数组对象。如果您想要更高的效率,请使用更好的数据结构。您的数据远未针对您需要完成的任务进行优化。
  • 没有循环是不可能的
  • 为什么它不可能没有循环检查我的答案使用 NSPredicate 过滤它
  • @CoolMonster 您确实意识到谓词的实现可能会使用循环,并且可能比编写专门构建的基于循环的解决方案效率低。
  • 我不太了解使用 NSPredicate 的效率,但是 2 行代码比 10 行代码好!!!

标签: ios objective-c nsarray nsdictionary


【解决方案1】:
//Json data
NSString *jsonString = @"{\"value\":[{\"ctgid\":\"1\",\"catename\":\"tow\"},{\"ctgid\":\"2\",\"catename\":\"towrequest\"},{\"ctgid\":\"3\",\"catename\":\"electrical\"},{\"ctgid\":\"5\",\"catename\":\"plumber\"},{\"ctgid\":\"6\",\"catename\":\"maintenance\"},{\"ctgid\":\"7\",\"catename\":\"home\"},{\"ctgid\":\"8\",\"catename\":\"computer\"},{\"ctgid\":\"9\",\"catename\":\"1q2w\"}]}";
NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
//Converting the data into NSDictionary
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

//Get the array of objects
NSArray *array = [NSArray arrayWithArray:[json objectForKey:@"value" ]];

//Category filter names
NSArray *filteCatename = [NSArray arrayWithObjects:@"tow",@"towrequest",@"plumber",nil];
//NSPreicate to filter the array using "in" constrain
NSArray *filtered = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(catename in %@)", filteCatename]];

您可以使用NSPredicate 直接过滤NSArray 而无需循环。

【讨论】:

  • 其中一个要求是以与列表中的字符串相同的顺序获得结果。使用此谓词不太可能确保这种情况发生。
  • 是的,顺序相同。
  • 哎呀,对不起,你说得对,它不按顺序但不用担心,我不希望它按顺序。
【解决方案2】:

为时已晚,虽然我已经回答了希望这可以帮助..

   [dictArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { //dictArray is an array contains your "value" 
       if([arrCatename containsObject:[obj objectForKey:@"catename"]]) //arrCatename is array contains catename list
        {
          [arrCatid addObject:[obj objectForKey:@"ctgid"]]; //arrCatid is the result
        }
   }];

  NSLog(@"%@",arrCatid.description);

【讨论】:

    【解决方案3】:

    我还没有测试过,但希望就是这样。

    NSMutableArray *arrCatID = [NSmutableArray alloc]init];
    for (NSDictionary *instance in myDictionary){ // myDictionary is the values of "Value"
             NSString *content = [instance objectForKey:@"catename"];
            for (NSString *catName in stringArray) { // stringArray --> has already the CatNAmes with you 
               if (catName == content) {
                 [arrCatID addObject:[instance objectForKey:@"ctgid"];
               break;
              }
           }
      }
    

    【讨论】:

    • 感谢朋友的回答,但我已经尝试过了,如果可能的话,我想在没有任何循环的情况下这样做
    • 怎么可能,不通过字典。我们应该与您的动态内容进行比较吧?
    • 好的。我正在寻找类似 NSPredicate 的东西。如果我找不到任何东西,for 循环将是最后的选择。
    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 2020-01-18
    相关资源
    最近更新 更多