2

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

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

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

4

5 回答 5

4

韦恩的回答会很好。

试试这个代码片段,它使用从你的问题形成的 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文件

于 2013-05-29T07:11:55.737 回答
2

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

[NSPredicate predicateWithFormat:@"Person.isMale == %@)", [NSNumber numberWithBool:YES]];
于 2013-05-29T06:49:17.263 回答
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];
于 2013-05-29T14:43:51.710 回答
1

你检查过KVC吗?

尝试这个 :

[NSPredicate predicateWithFormat:@"(Human.Person.isMale == 1)"];
于 2013-05-29T06:48:26.873 回答
0

尝试这个...

[NSPredicate predicateWithFormat:@"isMale == %@)", [NSNumber numberWithBool:(BOOL)true]];
于 2013-05-29T06:40:11.977 回答