匹配领域对象的分隔数组



我遇到了一些问题。我有一个来自服务器的 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]])

所以,我需要告诉领域,一个数组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({ 
$0.dayIds.map({
$0.filter({ 
$0.id == dayId
})
})
})

最新更新