Ios Swift数组筛选器属性

Ios Swift数组筛选器属性,ios,swift,Ios,Swift,我正在为基于用户输入的搜索过滤器工作。我有以下对象模型 public class MenuItemDO: DomainEntity { public var categoryId: String? public var categoryName: String? public var products = [ProductDO]() } public class ProductDO: Mappable { public var itemName: String? publi

我正在为基于用户输入的搜索过滤器工作。我有以下对象模型

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”:

所以我现在得到的是这个代码。我检索数据库中保存的所有菜单项,然后对其进行筛选

// This will result an array that is type of: MenuItemDO
let menuItemCategoryfilteredArray = menuItemArray.filter({$0.categoryName?.lowercased() == searchBar.text?.lowercased()})
基本上,用户将能够直接按类别名称或产品名称进行搜索

我的问题是,如何过滤用户输入,然后将其转换为ProductDO

通常我只会根据模型对象的“父对象”(在本例中为MenuItemDO)进行筛选,但在这种情况下,我似乎无法进行筛选,因为它与tableView数据源无关

有人能指引我吗?谢谢诸如此类的事

let products = menuItemArray.filter {
    $0.categoryName?.range(of: "search text", options: .caseInsensitive) != nil
  }.flatMap { $0.products }

与方法不同,将
$0.products
数组展平为单个数组

您需要做的是在过滤后的数组上应用
map

let finalArray = menuItemCategoryfilteredArray.map{$0.products}
这将返回
[[ProductDO]]

希望这会有所帮助:)。

使用
map
函数您的问题与此类似:是这样吗?或者您只想对产品进行筛选而不使用MenuItem?不,它将返回
[[ProductDO]]]
。您好,先生,如果我还想启用用户搜索产品名称,该怎么办?产品名称是内部的另一个数组
let finalArray = menuItemCategoryfilteredArray.map{$0.products}