2014-05-08 33 views
2

我有一个NSArray自定义对象,并且想要过滤该数组以在特定键上唯一。我在搜索答案时看到的大部分内容涉及到使用valueForKey:,valueForKeyPath:@distinctUnionOfObjects,但那些返回数组的值为该密钥。我想要整个对象。基于密钥获取对象的唯一NSArray

对象被分类为PFObject s,因此它们符合KVC,我希望它们在objectId键上过滤。

+0

如果你在你的问题中提供了更多的细节,这将有助于你的数组中的对象是什么以及过滤应该在什么值上完成。 – rmaddy

+0

我添加了一些更多的信息,但它是一个非常通用的问题,可以应用于任何KVO对象的任何键。 – doman412

+1

它不是通用的。您的需求非常具体。如果具有许多不同值的两个不同对象碰巧具有相同的“键”,结果应该如何?你想要哪个物件? – rmaddy

回答

3

在一个类别将这个上的NSArray:

-(NSArray*)arrayFilteredForUniqueValuesOfKeyPath:(NSString*)keyPath 
{ 
    NSMutableSet* valueSeen = [NSMutableSet new]; 

    return [self filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
     id value = [evaluatedObject valueForKeyPath:keyPath]; 

     if(![valueSeen containsObject:value]) 
     { 
      [valueSeen addObject:value]; 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    }]]; 
} 

当然,这个概念是一种有缺陷的,因为你真的没有办法确定其有任何的n个对象,为的keyPath你给的值真的很想(在这种情况下,你得到第一个)