为领域对象匹配分离的数组

Matching separated arrays for Realm Object

我遇到了一些问题。我有来自服务器的 JSON 响应:

{
  "days" : [
    {
      "id" : 1,
      "name" : "Day 1 - first day",
      "url": "http://example.com/days/1"
    },
    {
      "id" : 2,
      "name" : "Day 2 - second day",
      "url": "http://example.com/days/2"
    },
    ...
  ],
  "week" : [
    {
       "id" : 1,
       "dayIds" : [1, 2, 6, 9, 23, 44, 2345],
       "name" : "Rest week"
    },
    {
       "id" : 35,
       "dayIds" : [34,77,23,67,126,224],
       "name" : "Educational week"
    },
  ],
  "plan" : {
    "weekIds: [1, 6, 23, 74]
  }
}

我的数据模型(没有映射):

class Day: Object {
    @objc dynamic var id: Int = -1
    @objc dynamic var name: String = ""
    @objc dynamic var url: String = ""
}

class Week: Object {
    var dayIds = List<String>()
    @objc dynamic var name: String = ""
    @objc dynamic var id: Int = -1
    var days: List<Week>? = nil
}

class Plan: Object {
    var weekDays = List<String>()
    var weeks: List<Week>? = nil
}

映射代码:

let json: [String: Any] = try! JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String: Any]

let plans: [Plan] = Mapper<Plan>().mapArray(JSONArray: json["plans"] as! [[String: Any]])
let days: [Day] = Mapper<Day>().mapArray(JSONArray: json["days"] as! [[String: Any]])
let weeks: [Week] = Mapper<Week>().mapArray(JSONArray: json["weeks"] as! [[String: Any]])

所以,我需要告诉 realm 一个数组 weeks 属于 plan.weeks,一个数组 days 属于对象 week.days 并与它们相关联 id的。我怎样才能更简单地做到这一点?你有什么想法吗?

替代解决方案是像这样的头脑暴力。

for week in weeks {
    for dayId in week.dayIds {
        for day in days {
            if day.id == dayId {
                week.days.append(day)
            }
        }
    }
}
for plan in plans {
    for week in weeks {
        for weekId in plans.weekIds {
            if weekId == week.id {
                plan.weeks.append(week)
            }
        }
    }
}

我相信某个地方存在更纯粹和简单的解决方案:) 谢谢。

您的数据结构似乎非常嵌套,因此您将不得不进行内部循环。如果你想要更快捷的东西,请在此处使用 map 和 filter 而不是 for 循环:

let days = weeks.map({ 
       [=10=].dayIds.map({
          [=10=].filter({ 
              [=10=].id == dayId
          })
       })
    })