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 所有 Products
的 categories
数组包含一个 Product
和 id
1.
当然,这是假设您只查找单个 id
的类别。如果您需要检查多个 ids
,您可以使用 OR
.
修改上面的内容
注意:我用 NSArray
测试了上面的谓词,而不是 Realm。但是,如果您查看 Realm 谓词备忘单,它确实支持谓词使用的所有运算符:
所以,基本上,问题是,我有一个对象,我们称它为 "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 所有 Products
的 categories
数组包含一个 Product
和 id
1.
当然,这是假设您只查找单个 id
的类别。如果您需要检查多个 ids
,您可以使用 OR
.
注意:我用 NSArray
测试了上面的谓词,而不是 Realm。但是,如果您查看 Realm 谓词备忘单,它确实支持谓词使用的所有运算符: