Ios NSArray-如何根据与同一数组中另一个对象匹配的两个属性筛选数组?

Ios NSArray-如何根据与同一数组中另一个对象匹配的两个属性筛选数组?,ios,objective-c,cocoa-touch,nsmutablearray,nsarray,Ios,Objective C,Cocoa Touch,Nsmutablearray,Nsarray,我有一个这个对象的数组: NSString *pageNumber; NSInteger index; NSString *textValue; NSString *bookmark; NSString *GUID; 我想删除具有相同textValue和index值的重复对象。它不应该看其他属性,而应该只看这两个属性 编辑:另外,为了在会话期间保持值不变,我只想为两个相同的条目选择排序中较低的GUID 我以前使用过distinctUnionOfObjects,但它只能在我需要按一个属性过滤重复

我有一个这个对象的数组:

NSString *pageNumber;
NSInteger index;
NSString *textValue;
NSString *bookmark;
NSString *GUID;
我想删除具有相同
textValue
index
值的重复对象。它不应该看其他属性,而应该只看这两个属性

编辑:另外,为了在会话期间保持值不变,我只想为两个相同的条目选择排序中较低的GUID

我以前使用过
distinctUnionOfObjects
,但它只能在我需要按一个属性过滤重复项时帮助我

我想到的另一个创造性的方法是在数组中创建另一个属性,它是这两个属性的组合,然后对它们执行
distinctUnionOfObjects
,但这似乎是肮脏的和黑客行为


实现这一点最简单、最有效的方法是什么?

如果在对象上实现
isEqual:
哈希
,它将自动不允许在
NSSet
中重复对象。通过使用
传感器数据集
,可以保持对象的顺序

@implementation YourClass
- (BOOL)isEqual:(id)other {
  if (!([self class] == [other class]))
    return NO;
  YourClass *element = other;
  if (self.index != element.index) return NO;
  if (![self.textValue isEqualToString:element.textValue]) return NO;
  return YES;
}

- (NSUInteger)hash {
  NSUInteger prime = 31;
  NSUInteger hash = [[self class] hash];
  hash = hash * prime + self.index;
  hash = hash * prime + (NSUInteger)([self.textValue hash] ^ ([self.textValue hash] >> 32));
  return hash;
}
@end

uniqueObjects = [NSOrderedSet orderedSetWithArray:allObjects];

您是否查看过预测
NSArray
有一个方法可以让你使用谓词,它们应该让你做你想做的事情。