NSPredicate深入过滤价值

时间:2013-05-29 06:32:39

标签: ios search nsarray nsdictionary nspredicate

我有以下多个数据列表,我想过滤掉男性的人     使用NSPredicate我该怎么做

[
  "Human": {
    "Person": {
      "isMale": true,
      "name": "PersonA",
      "id": "100"
    },
    "isCheck": true
  },
  "Human": {
    "Person": {
      "isMale": false,
      "name": "PersonB",
      "id": "200"
    },
    "isCheck": false
  },
  .
  .
  .
  .
]

数组包含字典,每个字典包含一个单词字典,我想过滤内部字典人员键。 任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:4)

Wain's answer可以正常使用。

请尝试使用根据您的问题形成的json文件的代码段。

NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Humans" ofType:@"json"];
NSData *data = [[NSData alloc]initWithContentsOfFile:filePath];
NSArray *users = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Human.Person.isMale == %@",@true];

NSArray *filteredArray = [users filteredArrayUsingPredicate:predicate];
NSLog(@"%@",filteredArray);

Humans.json档案

答案 1 :(得分:2)

在您的谓词中,您需要使用Person.isMale,因为您需要导航到内部词典。

[NSPredicate predicateWithFormat:@"Person.isMale == %@)", [NSNumber numberWithBool:YES]];

答案 2 :(得分:1)

您是否选中了 KVC

试试这个:

[NSPredicate predicateWithFormat:@"(Human.Person.isMale == 1)"];

答案 3 :(得分:1)

试试这个

NSString *valueString = @"true"

NSPredicate *myPredicate = [NSPredicate predicateWithBlock:^BOOL(id       evaluatedObject, NSDictionary *bindings) {

 if([[[[evaluatedObject objectForKey:@"Human"] objectForKey:@"Person"] objectForKey:@"isMale"] isEqualToString:valueString])
                return YES;

            return NO;

        }];

NSArray *filteredArray = [yourArray filteredArrayUsingPredicate:myPredicate];

答案 4 :(得分:0)

试试这个......

[NSPredicate predicateWithFormat:@"isMale == %@)", [NSNumber numberWithBool:(BOOL)true]];