我想过滤基本上形成树型图形的对象数组。我想要做的是过滤掉这个数组中可见属性为NO的所有对象,或者它的父/祖父/ etc可见属性为真(子对象可以将可见属性设置为YES,而其父母可以为NO)。可递归遍历对象图的NSPredicate?
我不清楚我会如何去使用NSPredicate语法来继续搜索父节点,直到没有父母或可见属性被发现。有什么办法可以解决这个问题吗?
我想过滤基本上形成树型图形的对象数组。我想要做的是过滤掉这个数组中可见属性为NO的所有对象,或者它的父/祖父/ etc可见属性为真(子对象可以将可见属性设置为YES,而其父母可以为NO)。可递归遍历对象图的NSPredicate?
我不清楚我会如何去使用NSPredicate语法来继续搜索父节点,直到没有父母或可见属性被发现。有什么办法可以解决这个问题吗?
其一段时间以来我问这个问题,我想我与我在做什么,另一个方向去了,但也有一些可能现在我认识到解决什么,我想当时:
- (BOOL) isVisible { return visible && [parent isVisible]; } //... id filtered = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"visible == YES"]];
[array filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { id obj = evaluatedObject; while (obj) { if (![obj isVisible]) return NO; obj = [obj parent]; } return YES; }]];
或者一个组合这两个(这将是我认为最健壮和可读的)。
我不确定你想要做什么可以用一个简单的单一的谓词。如果它是一棵树,并且您使用谓词来获取节点,那么您需要编写一个向上遍历并返回BOOL指示是否应该删除的方法。
然后,只是让你的节点并把它们放在一个NSMutableArray,并做了
for (int i = 0; i < [results count]; i++)
{
if ([self shouldBeRemoved:[results objectAtIndex:i]])
{
[results removeObjectAtIndex:i];
i--;
}
}
你shouldBeRemoved:方法应该是相当直接的递归方法。