NSPredicate过滤NSMutableArray子NSDictionaries

时间:2013-03-04 06:11:04

标签: nsarray nsdictionary nspredicate

我正在开发一个项目,我正在下载一大堆JSON,然后用它制作漂亮的UITableView。

我已经将JSON解析为一个很好的NSMutableArray,然后我将其输入到UITableView中。一切正常,看起来很漂亮。

我遇到的问题是我的NSMutableArray中有一个字典对象,我想用它来执行tableview的过滤。

这是我正在查看的NSMutableArray中对象的NSLog:

{
id = 123456;
    issues =     (
                {
            id = 4;
            name = "Ape";
        },
                {
            id = 25;
            name = "Chimp";
        },
                {
            id = 28;
            name = "Human";
        }
    );
status = open;
}

我想写的是NSMutableArray中问题字典中任何名称列的谓词过滤器。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"name", @"Human"];
NSArray *predicateFilteredArray = [tableViewArray filteredArrayUsingPredicate:predicate]; 

但是,我无法找出与问题中的名称匹配的谓词变量的正确格式。我已阅读并重新阅读谓词编程指南,大约一半的堆栈溢出项标记为NSPredicate,我无法弄清楚语法。 我已经尝试了很多SELF的变化,而且我只是很老了。

2 个答案:

答案 0 :(得分:2)

如果我正确理解了问题,则以下谓词应该有效:

[NSPredicate predicateWithFormat:@"ANY issues.name == %@", @"Human"]

这给出了数组中的所有对象,其中至少有一个“问题”的“名称”等于“人”。

答案 1 :(得分:0)

我编写了一个名为Linq to ObjectiveC的类别方法库,这使得这类事情变得容易一些。从我可以收集到的内容中,您有一系列项目,其中每个项目都有一个名为issues的属性,它本身就是一个数组?

如果要查找名为“人”的问题的所有项目,可以执行以下操作:

NSArray* matches = [inputArray where:^BOOL(id item) {
    return [[item issues] any:^BOOL(id issue) {
        return [[issue name] equalTo:@"Human"];
    }];
}]

这使用了Linq到ObjectiveC whereany方法。