arrays - 使用对象过滤嵌套数组
问题描述
我有一个类别数组。每个 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
解决方案
您应该简单地filter
将所有没有优惠的类别与您的类型相同。您可以通过以下方式实现:
- 过滤所有类别和
- 检查
filter
当前报价是否包含myType
代码:
let filtered = categories.filter { category in
category.offers?.contains(where: { $0.type == myType }) ?? false
}
请注意,这category.offers?.[...]
是可选值,因此如果左侧部分为 ,则作为结果?? false
返回。false
nil
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
的类别。
推荐阅读
- c# - 错误 CS0246:找不到类型或命名空间名称“Npgsql”(您是否缺少 using 指令或程序集引用?)
- jquery - 如何最初在 swiper 中隐藏延迟加载的图像
- c++ - P0847 推断这一点 - 它可以允许通用克隆而不需要 CRTP 吗?
- sql - 查询记录但返回按奇数日期范围分组
- reactjs - 如何测试与 Ant Design 的 Popover 内容的交互?
- jquery - 我有一个包含两个捆绑包的网页。Webpack 不会在第二个包上实例化 jquery ui 项
- html - 为什么我的图片在手机 iphone safari 上被拉伸?
- javascript - JQuery 无法理解如何在多个选项中对这些日期进行排序
- go - 以字节为单位读取文件
- amazon-quicksight - 如何根据 Amazon Quicksight 中的子记录对记录进行分组