3

我正在尝试过滤本质上形成树形图的对象数组。我想要做的是从这个数组中过滤掉所有可见属性为NO的对象,或者如果它的父/祖父/等可见属性为真(子对象的可见属性可以是YES,而其父对象可以是NO)。

我不清楚我将如何使用 NSPredicate 语法来继续搜索父节点,直到没有父节点或找到可见属性。有什么办法可以解决这个问题吗?

4

2 回答 2

1

自从我问这个问题以来已经有一段时间了,我想我正在做的事情朝着另一个方向发展,但是我现在意识到有一些可能性可以解决我当时想要的问题:

  • 让可见属性方法以递归方式运行,而不是让格式谓词这样做。这可以像这样完成:
- (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;
}]];

或者两者的结合(我认为这将是最健壮和可读的)。

于 2012-03-13T16:05:34.543 回答
0

我不确定您要使用简单的单个谓词来做什么。如果它是一棵树并且您正在使用谓词来获取节点,那么您需要编写一个向上遍历并返回一个 BOOL 指示是否应该删除它的方法。

然后,只需获取您的节点并将它们放入 NSMutableArray 并执行

for (int i = 0; i < [results count]; i++)
{
    if ([self shouldBeRemoved:[results objectAtIndex:i]])
    {
        [results removeObjectAtIndex:i];
        i--;
    }
}

你的 shouldBeRemoved: 方法应该是一个非常简单的递归方法。

于 2010-12-02T12:22:28.120 回答