我正在尝试过滤本质上形成树形图的对象数组。我想要做的是从这个数组中过滤掉所有可见属性为NO的对象,或者如果它的父/祖父/等可见属性为真(子对象的可见属性可以是YES,而其父对象可以是NO)。
我不清楚我将如何使用 NSPredicate 语法来继续搜索父节点,直到没有父节点或找到可见属性。有什么办法可以解决这个问题吗?
我正在尝试过滤本质上形成树形图的对象数组。我想要做的是从这个数组中过滤掉所有可见属性为NO的对象,或者如果它的父/祖父/等可见属性为真(子对象的可见属性可以是YES,而其父对象可以是NO)。
我不清楚我将如何使用 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: 方法应该是一个非常简单的递归方法。