我有Manager对象和Account对象。 Manager对象具有属性Account。
有一个Manager对象的NSArray,它需要由Account独有!
示例数组:
NSArray *managers = @[Manager1(has Account1), Manager2(has Account1), Manager3(has Account1), Manager4(has Acconut2), Manager5(has Account2)];
我需要一个只有Manager1和Manager4的NSArray。
答案 0 :(得分:7)
您需要的是distinctUnionOfObjects
[managers valueForKeyPath:@"@distinctUnionOfObjects.Account"];
@distinctUnionOfObjects @distinctUnionOfObjects运算符返回一个数组,该数组包含由运算符右侧的键路径指定的属性中的不同对象。
以下示例返回已删除任何重复值的事务中事务的收款人属性值:
NSArray *payees = [transactions valueForKeyPath:@"@distinctUnionOfObjects.payee"];
生成的收款人数组包含以下字符串:汽车贷款,通用电缆,动物医院,绿色电力,抵押贷款。
@unionOfObjects运算符类似,但不删除重复的对象。
答案 1 :(得分:3)
您需要在Manager类中覆盖isEqual方法(也可能在Account类中)。之后,通过首先检查将管理器添加到数组,如果数组已包含具有此类帐户的管理器。检查下面的可能解决方案:
- (BOOL)isEqual:(id)object {
if (object == self) {
return YES;
} else if (![object isKindOfClass:[Manager class]]) {
return NO;
}
Manager *manager = (Manager *)object;
return [self.account isEqual:manager.account];
}
- (BOOL)isEqual:(id)object {
if (object == self) {
return YES;
} else if (![object isKindOfClass:[Account class]]) {
return NO;
}
Account *account = (Account *)object;
return [self.someUniqueId isEqual:account.someUniqueId];
}
NSMutableArray *filteredManagers = [NSMutableArray array];
[managers enumerateObjectsUsingBlock:^(Manager *manager, NSUInteger idx, BOOL *stop) {
if (![filteredManagers containsObject:manager]) {
[filteredManagers addObject:manager];
}
}];
答案 2 :(得分:1)
NSArray *managers = // The 5 Manager objects in your example
NSMutableArray *filteredManagers = [NSMutableArray array];
NSMutableArray *accountsManaged = [NSMutableArray array];
for (Manager *manager in managers) {
if (![accountsManaged containsObject:manager.account]) {
[filteredManagers addObject:manager];
[accountsManaged addObject:manager.account];
}
}
// filteredManagers now contains Manager1 and Manager4
答案 3 :(得分:0)
假设您有一个单独的数组(!)包含帐户,并进一步假设您的类符合键值,我会通过该帐户数组进行枚举,并找到管理每个帐户的所有管理员。然后选择第一个管理器并将其添加到新数组中,如下所示:
NSMutableArray *filteredManagers = [NSMutableArray array];
for (Account *account in accounts) {
NSArray *managersForAccount = [managers filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"account == %@", account];
[filteredManagers addObject:[managersForAccount firstObject]];
}
// do something with filteredManagers