如何根据字典键过滤数组?

时间:2016-02-21 21:18:23

标签: ios xcode nsarray nspredicate

我有一个对象数组。数组中的对象包含一个字典作为其属性之一,我需要为数组中的每个对象搜索其中一个键的值。我需要使用类似的条件(我认为它实际上包含在objective-c中我可能是错的)。我使用方法_search_results = [_people filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"details[@\"firstName\"] contains %@",searchBar.text]];,我认为将返回适合该搜索条件的所有对象。这是我的问题

1)我可以使用另一种方法吗?或者也许是一般的不同类?也许更有效的方法使用? 2)我是否正在字典中正确搜索值?由于它是对象的属性,我认为我做得对。我的语法看起来正确dictionaryName[keyName] contains value

我只使用NSPredicate与对象的属性,我从来没有必要搜索像这样的对象中的字典。就像我说的那样,我想我就在这里。

回应第一组答案

_search_results = [_people indexesOfObjectsPassingTest:^BOOL(PeopleObject *person, NSUInteger idx, BOOL * _Nonnull stop) {

    NSString *last_name = person.details[kPersonLastNameKey];
    if([last_name containsString:searchBar.text]){
        return TRUE;
    }
    else 
        return FALSE;
}];

1 个答案:

答案 0 :(得分:1)

至少有六种方法可以做到这一点。如果你使用的是Objective-C或Swift,你不会说,尽管你展示的示例代码看起来像Objective-C。

如果你使用的是Swift,你可以使用内置的Swift过滤功能,但让我们放弃。

您现在可以使用filteredArrayUsingPredicate

您可以使用indexesOfObjectsPassingTest在数组中构建满足条件的NSIndexSet个对象(该方法接受一个块,对于块返回true的所有对象,生成的索引集)包括对象的索引。然后,您使用objectsAtIndexes返回索引集中列出的对象数组。

我还没有对它进行基准测试,但我怀疑对于大型数组,谓词方法较慢,因为谓词是一种非常灵活的选择对象的方法,而灵活的代码往往是较慢的代码。但是,除非您要过滤数万个或更多对象,否则我怀疑您是否注意到性能上的差异。

不要陷入premature optimization的陷阱 - 浪费你的时间,让你的代码更复杂,以优化对你的应用程序性能没有任何有意义影响的事情。

除非您的应用运行速度明显缓慢,并且您已对其进行测试并确定阵列过滤对此缓慢有重大影响,否则可能不值得担心。