从目标c中的数组中删除重复项

Asa*_*han 12 unique objective-c nsarray

我有一个包含自定义对象的数组.每个数组项都有一个名为"name"的字段.现在我想根据此名称值删除重复的条目.

我应该如何实现这一目标.

提前致谢.

Pey*_*loW 28

我不知道框架提供的任何标准方法.所以你必须在代码中做到这一点.这样的事情应该是可行的:

NSArray* originalArray = ... // However you fetch it
NSMutableSet* existingNames = [NSMutableSet set];
NSMutableArray* filteredArray = [NSMutableArray array];
for (id object in originalArray) {
   if (![existingNames containsObject:[object name]]) {
      [existingNames addObject:[object name]];
      [filteredArray addObject:object];
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 不应该是[object objectForKey:@"name"]; 在那边循环? (2认同)

Jac*_*kin 9

您可能必须自己编写此过滤方法:

@interface NSArray (CustomFiltering)
@end

@implementation NSArray (CustomFiltering) 

- (NSArray *) filterObjectsByKey:(NSString *) key {
   NSMutableSet *tempValues = [[NSMutableSet alloc] init];
   NSMutableArray *ret = [NSMutableArray array];
   for(id obj in self) {
       if(! [tempValues containsObject:[obj valueForKey:key]]) {
            [tempValues addObject:[obj valueForKey:key]];
            [ret addObject:obj];
       }
   }
   [tempValues release];
   return ret;
}

@end
Run Code Online (Sandbox Code Playgroud)


Mat*_*rst 7

我知道这是一个老问题,但这是另一种可能性,取决于你需要什么.

Apple确实提供了一种方法 - 键值编码收集操作符.

对象运算符允许您对集合执行操作.在这种情况下,您需要:

@distinctUnionOfObjects

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

NSArray *distinctArray = [arrayWithDuplicates valueForKeyPath:@"@distinctUnionOfObjects.name"];

但是,在您的情况下,您需要整个对象.所以你需要做的是双重的:1)@distinctUnionOfArrays改为使用.例如,如果您有来自其他集合的这些自定义对象,请使用@distinctUnionOfArray.myCollectionOfObjects 2)isEqual:如果它们的.name相等,则对这些对象进行实现