0

我有三种类型的自定义类(见下文)和三个数组 componentList、componentGroupList 和 componentGroupItemList。数组没有链接,每个数组都包含所有对象。我需要过滤特定组件、其所有相关组及其所有相关项目。

现在,我知道如何使用 @"componentId==123" 过滤 componentList 并获取所需的组件对象。我还可以使用相同的谓词从 componentGroupList 中过滤其组,因为 ComponentGroup 对象包含相同的 componentId 键。但是,我不知道如何从 componentGroupItemList 中过滤相关的 ComponentGroupItem 对象。

目前,我已经过滤了包含 ComponentGroup 对象的数组,并且我想使用该数组过滤 componentGroupItemList。是否有可能,或者我是否需要从filteredComponentGroupList 中提取所有“groupId”值到一个字符串中,然后做一些谓词?

课程:

@interface Component : NSObject

  @property (nonatomic, strong) NSNumber *componentId;
  @property (nonatomic, strong) NSString *title;

@end

@interface ComponentGroup : NSObject

  @property (nonatomic, strong) NSNumber *groupId;
  @property (nonatomic, strong) NSNumber *componentId;
  @property (nonatomic, strong) NSString *title;

@end

@interface ComponentGroupItem : NSObject

  @property (nonatomic, strong) NSNumber *itemId;
  @property (nonatomic, strong) NSNumber *groupId;
  @property (nonatomic, strong) NSString *title;

@end
4

2 回答 2

3

您必须先提取组 ID

NSArray *groupIds = [filteredComponentGroupList valueForKey:@"groupId"];

并将其用作谓词

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"groupId IN %@", groupIds];
NSArray *filteredComponentGroupItemList = [componentGroupItemList filteredArrayUsingPredicate:predicate];
于 2013-05-07T12:39:04.567 回答
2

乍一看,您的数据结构似乎有点多余,但我想您已经考虑过了。

如果我正确理解您的要求,那么您有一个已经过滤的组件组数组(我们称之为filteredComponentGroups),并且您希望使用 过滤另一个数组(componentGroupItemListfilteredComponentGroups

在这种情况下,您可以使用IN运算符 ofNSPredicate并在数组上构造 IDvalueForKey:数组。valueForKey:on an array 构造一个新数组,其中仅包含原始集合中每个对象的该键的值。对于这种情况非常强大。

 NSArray *filteredComponentGroups = // ... your filtered components

 NSArray *componentIdsFromFilteredComponentGroups = [filteredComponentGroups valueForKey: @"groupId"];
 NSPredicate *inFilteredComponentGroupsP = [NSPredicate predicateWithFormat: @"groupId IN %@", componentIdsFromFilteredComponentGroups];

 NSArray *filteredGroupItemList = [componentGroupItemList filteredArrayUsingPredicate: inFilteredComponentGroupsP];

直接在浏览器中输入,所以要小心拼写错误。

于 2013-05-07T12:38:45.510 回答