我正在基于用户输入的搜索过滤器。我有以下这些对象模型
public class MenuItemDO: DomainEntity {
public var categoryId: String?
public var categoryName: String?
public var products = [ProductDO]()
}
public class ProductDO: Mappable {
public var itemName: String?
public var price: Double = 0.0
public var dynamicModifiers = [DynamicModifierDO]()
}
所以我有一个tableView将填充过滤器结果。
var dataSource = [ProductDO]()
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if self.dataSource.count > 0 {
return self.dataSource.count
}
return 1
}
在我看来,最好将结果作为ProductDO进行收集,然后填充数据,因为有时可能会发生这种情况,用户键入“ C”:
Curry Rice -> Category: Food
Coke -> Category: Beverages
所以我现在得到的是这段代码。我检索保存在数据库中的所有菜单项,然后对其进行过滤。
// This will result an array that is type of: MenuItemDO
let menuItemCategoryfilteredArray = menuItemArray.filter({$0.categoryName?.lowercased() == searchBar.text?.lowercased()})
基本上,用户将可以直接按类别名称或产品名称进行搜索。
我的问题是,如何过滤用户输入,然后将其转换为ProductDO?
通常,我将仅基于模型对象的“父对象”进行过滤,在这种情况下为MenuItemDO,但在这种情况下,我似乎无法执行此操作,因为它与tableView数据源无关。
有人可以引导我吗?谢谢
答案 0 :(得分:0)
是这样吗?:
let products = menuItemArray.filter {
$0.categoryName?.range(of: "search text", options: .caseInsensitive) != nil
}.flatMap { $0.products }
与map(_:)
方法不同,flatMap(_:)
将$0.products
数组展平为单个数组。
答案 1 :(得分:0)
您要做的是在过滤后的数组上应用map
。
let finalArray = menuItemCategoryfilteredArray.map{$0.products}
这将返回[[ProductDO]]
。
希望这会有所帮助:)。