Swift数组过滤器属性

时间:2019-04-16 10:15:10

标签: 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?
  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数据源无关。

有人可以引导我吗?谢谢

2 个答案:

答案 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]]。 希望这会有所帮助:)。