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

标签 ios xcode nsarray nspredicate

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

1) 我可以使用另一种方法来做到这一点吗?或者也许是一个不同的类(class)?也许使用更有效的方法? 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;
}];

最佳答案

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

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

您可以像现在一样使用 filteredArrayUsingPredicate

您可以使用 indexesOfObjectsPassingTest 为数组中满足您条件的对象构建一个 NSIndexSet(该方法需要一个 block ,并且对于您的 block 返回的所有对象true,生成的索引集包括对象的索引。然后您将使用 objectsAtIndexes 返回索引集中列出的对象的数组。

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

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

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

关于ios - 如何根据字典键过滤数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35542192/

相关文章:

ios - 如何在 iOS 应用程序中将任何格式(.txt、.Doc)文件转换为 epub 文件

visual-studio - Visual Studio有什么优点?

iphone - 如何使用 AFNetworking 2.0 下载图像?

objective-c - 修改 NSArray 中 UILabels 的文本属性

ios - 从NSArray获取行

iOS:CHCSVParser 和 NSPredicate?

ios - fetchedResultsController 不更新过滤器

ios - 在 ipad 中从 popOver 推送 View

ios - 调整 PaintCode 生成的 View 大小时如何保持纵横比?

swift - 在 Swift 3 中解析 NSArray