NSPredicate 过滤复杂对象数组

NSPredicate filtering over array of complex objects

所以,基本上,问题是,我有一个对象,我们称它为 "Product"

struct Product {
  let categories: [Category]
}

类别如下所示:

struct Category {
  let id: Int
}

我需要的是创建 NSPredicate,它会检查类别列表是否包含特定 ID 的类别。现在确定是否可行,但也许有比使用简单的 Int 数组创建另一个 属性 更好的解决方法? 更新:NSPredicate 是必需的,因为我需要在 Realm 数据库过滤器查询中使用它。

如果您正在使用 Swift,您可以使用 filter 和 contains 方法来过滤数组。

当您有一个包含产品的数组时,您可以通过以下方式过滤它:

let filteredProducts = products.filter{ [=10=].categories.contains(where: { [=10=].id == 1 })}

上面的代码过滤了包含 id = 1 类别的产品

您可以简单地检查通过筛选类别返回的数组的计数。

struct Product {
  let categories: [Category]
}

struct Category {
  let id: Int
}

let c1 = Category(id: 1)
let c2 = Category(id: 2)
let c3 = Category(id: 3)

let p = Product(categories: [c1, c2, c3])
let yourCategoryId = 1
let filteredResults = p.categories.filter {
    [=10=].id == yourCategoryId
}
let isCategoryWithIdPresent = filteredResults.count > 0 ? true : false
print(isCategoryWithIdPresent)

希望对您有所帮助

NSPredicate 的正确格式是:

let predicate = NSPredicate(format: "ANY categories.id == %@", argumentArray: [1])

上面的例子将 return 所有 Productscategories 数组包含一个 Productid 1.

当然,这是假设您只查找单个 id 的类别。如果您需要检查多个 ids,您可以使用 OR.

修改上面的内容

注意:我用 NSArray 测试了上面的谓词,而不是 Realm。但是,如果您查看 Realm 谓词备忘单,它确实支持谓词使用的所有运算符:

https://academy.realm.io/posts/nspredicate-cheatsheet/?_ga=2.32752254.1161432538.1537175891-1199086799.1527592477