首页 > 解决方案 > 使用对象过滤嵌套数组

问题描述

我有一个类别数组。每个 Category 实例都有 offer 属性。

class Category {
   var offers : [Offer]?
   var title : String?
   var id : Int?
}

class Offer {
    var type : String?
}

//global variable
var categories = [ categ1, categ2, ...]

如何按 offer.type 过滤类别?

我已经尝试过:

return categories.map { (category) -> Category in
    let offers = category.offers?.filter { $0.type == myType }
    category.offers = offers
    return category
}

它可以工作,但在第二次调用函数后数组变为空。可能是因为报价被改写了?

然后我尝试了这个(产生了同样的错误结果):

var resultCategories = [Category]()

for category in categories {
    guard let offers = category.offers else { continue }

    var newOffers = [Offer]()

    for offer in offers {
        if offer.type == myType {
            newOffers.append(offer)
        }
    }

    category.offers = newOffers
    resultCategories.append(category)
}

return resultCategories

标签: arraysswiftfilter

解决方案


您应该简单地filter将所有没有优惠的类别与您的类型相同。您可以通过以下方式实现:

  1. 过滤所有类别和
  2. 检查filter当前报价是否包含myType

代码:

let filtered = categories.filter { category in
    category.offers?.contains(where: { $0.type == myType }) ?? false
}

请注意,这category.offers?.[...]是可选值,因此如果左侧部分为 ,则作为结果?? false返回。falsenil


UPD。

但我预计类别将只有类型 =“A”的优惠。也许我没有准确地描述这个问题。

您可以通过创建一个新的Category.

let filtered = categories.compactMap { category -> Category? in
    guard let offers = category.offers?.filter({ $0.type == "A" }) else { return nil }
    let other = Category()
    other.offers = offers
    return other
}

另请注意,我正在使用compactMap. 它允许我过滤空或无offers的类别。


推荐阅读