我怎样才能有条件地过滤数组

时间:2018-01-18 20:49:27

标签: swift

我试图按属性值过滤对象数组

      queryDatasource = datasource.filter {
            if (!values.users.isEmpty && values.users.contains($0.User.User)) {
                return true
            }

            if (!values.categories.isEmpty && values.categories.contains($0.Category.Category)) {
                return true
            }

            if (!values.priorities.isEmpty && values.priorities.contains($0.Priority.Priority)) {
                return true
            }

            if (!values.statuses.isEmpty && values.statuses.contains($0.Status.Status)) {
                return true
            }
            return false
        }

当我只选择一位用户Sara时,它按预期工作,我只看到Sara的结果。
当我选择第二个用户Mike时,它仍然按预期工作,只有MikeSara的结果。

现在,如果我添加了优先级过滤器High,它将按MikeSara返回所有对象。优先级为High的所有对象都会忽略用户(我得到的)用户Dave的高优先级对象(非预期)

简而言之,我想按User AND PriorityCategoryStatus进行过滤。如果它在用户过滤器中,则必须匹配

1 个答案:

答案 0 :(得分:2)

我将逐步到达解决方案,向您展示我是如何到达那里的。

首先,删除所有不必要的!values.x.isEmpty检查。如果序列为空,contains(_:)将始终返回false,因此我们不需要担心它。此外,我将从谓词中删除所有不必要的包围:

queryDatasource = datasource.filter {
    if values.users.contains($0.User.User) {
        return true
    }

    if values.categories.contains($0.Category.Category) {
        return true
    }

    if values.priorities.contains($0.Priority.Priority) {
        return true
    }

    if values.statuses.contains($0.Status.Status) {
        return true
    }

    return false
}

从这里开始,我们可以更好地将其识别为or操作,所以让我们明确地重写它:

queryDatasource = datasource.filter {
    return values.users.contains($0.User.User)
    || values.categories.contains($0.Category.Category)
    || values.priorities.contains($0.Priority.Priority)
    || values.statuses.contains($0.Status.Status)
}

如果我们可以使用or||),显然我们可以切换到and&&):

queryDatasource = datasource.filter {
    return values.users.contains($0.User.User)
    && values.categories.contains($0.Category.Category)
    && values.priorities.contains($0.Priority.Priority)
    && values.statuses.contains($0.Status.Status)
}