如何根据字典键过滤数组?
How to filter array based on dictionary key?
我有一组对象。数组中的对象包含一个字典作为其属性之一,我需要为数组中的每个对象搜索其中一个键的值。我需要使用类似的条件(我认为它实际上包含在 objective-c 中,但我可能是错的)。我正在使用 _search_results = [_people filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"details[@\"firstName\"] contains %@",searchBar.text]];
方法,我认为它将 return 我所有符合该搜索条件的对象。这是我的问题
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
(该方法需要一个块,并且对于您的块 return如果是,生成的索引集包括对象的索引。然后您将使用 objectsAtIndexes
到 return 索引集中列出的对象的数组。
我没有对其进行基准测试,但我怀疑对于大型数组,谓词方法速度较慢,因为谓词是一种非常灵活的选择对象的方法,而灵活的代码往往是较慢的代码。但是,除非您过滤数万个或更多对象,否则我怀疑您是否会注意到性能差异。
不要陷入 premature optimization 的陷阱 - 浪费您的时间并使您的代码更复杂,以优化对您的应用程序性能没有有意义影响的事情。
除非您的应用 运行 明显变慢,并且您已经对其进行测试并确定数组过滤对这种变慢有重大影响,否则可能不值得担心。
我有一组对象。数组中的对象包含一个字典作为其属性之一,我需要为数组中的每个对象搜索其中一个键的值。我需要使用类似的条件(我认为它实际上包含在 objective-c 中,但我可能是错的)。我正在使用 _search_results = [_people filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"details[@\"firstName\"] contains %@",searchBar.text]];
方法,我认为它将 return 我所有符合该搜索条件的对象。这是我的问题
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
(该方法需要一个块,并且对于您的块 return如果是,生成的索引集包括对象的索引。然后您将使用 objectsAtIndexes
到 return 索引集中列出的对象的数组。
我没有对其进行基准测试,但我怀疑对于大型数组,谓词方法速度较慢,因为谓词是一种非常灵活的选择对象的方法,而灵活的代码往往是较慢的代码。但是,除非您过滤数万个或更多对象,否则我怀疑您是否会注意到性能差异。
不要陷入 premature optimization 的陷阱 - 浪费您的时间并使您的代码更复杂,以优化对您的应用程序性能没有有意义影响的事情。
除非您的应用 运行 明显变慢,并且您已经对其进行测试并确定数组过滤对这种变慢有重大影响,否则可能不值得担心。