过滤对象的NSArray以具有唯一的属性对象

时间:2015-03-07 23:18:47

标签: ios objective-c nspredicate

我有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。

4 个答案:

答案 0 :(得分:7)

您需要的是distinctUnionOfObjects

[managers valueForKeyPath:@"@distinctUnionOfObjects.Account"];

以下是documentation

  

@distinctUnionOfObjects   @distinctUnionOfObjects运算符返回一个数组,该数组包含由运算符右侧的键路径指定的属性中的不同对象。

以下示例返回已删除任何重复值的事务中事务的收款人属性值:

NSArray *payees = [transactions valueForKeyPath:@"@distinctUnionOfObjects.payee"];

生成的收款人数组包含以下字符串:汽车贷款,通用电缆,动物医院,绿色电力,抵押贷款。

@unionOfObjects运算符类似,但不删除重复的对象。

答案 1 :(得分:3)

您需要在Manager类中覆盖isEqual方法(也可能在Account类中)。之后,通过首先检查将管理器添加到数组,如果数组已包含具有此类帐户的管理器。检查下面的可能解决方案:

  1. 覆盖经理isEqual
  2. - (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];
    }
    
    1. 覆盖帐户isEqual( NB!仅在需要时)
    2. - (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];
      }
      
      1. 过滤器阵列:
      2.   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